使用 SQL Server 获取列中第一次出现重复值的行

问题描述

假设我有这张桌子

Id   Order Value
------------------
aa   0     'cat'
ba   1     'dog'
bb   2     'yuk'
dc   3     'gen'
ca   4     'cow'
c1   5     'owl'
b0   7     'ant'
h9   8     'fly'
t4   9     'bee'
g2   10    'fox'
ea   11    'rat'
fa   12    'pig'
gu   13    'pig'
co   14    'pig'
fo   15    'pig'
ou   16    'pig'
eo   17    'pig'
ii   18    'pig'

查询是为了获得什么:

fa   12    'pig'

如您所见,12 到 18 之间的下一行。所有这些行在 pig 列中都有一个 Value

如何确定重复开始的行?

谢谢

解决方法

您可以将 WITH TIES 选项与窗口函数 lead()row_number() 结合使用

示例

Declare @YourTable Table ([Id] varchar(50),[Order] int,[Value] varchar(50))  Insert Into @YourTable Values 
 ('aa','cat'),('ba',1,'dog'),('bb',2,'yuk'),('dc',3,'gen'),('ca',4,'cow'),('c1',5,'owl'),('b0',7,'ant'),('h9',8,'fly'),('t4',9,'bee'),('g2',10,'fox'),('ea',11,'rat'),('fa',12,'pig'),('gu',13,('co',14,('fo',15,('ou',16,('eo',17,('ii',18,'pig')
 
Select top 1 with ties *
 From @YourTable
 Order By case when lead(value,1) over (order by [order]) = value then 1 else 2 end,row_number() over (order by [Order])

结果

Id  Order   Value
fa  12      pig
,

如果您想要重复发生的第一行,您可以使用 LEAD 获取每行的下一个值,ORDER BY 进行排序和 TOP (1)得到第一个结果

SELECT TOP (1) *
FROM (
    SELECT *,LEAD([Value]) OVER (ORDER BY [Order]) nextValue
    FROM tbl
) t
WHERE nextValue = [Value]
ORDER BY [Order];

如果您想要每次重复的第一行,您可以使用 LEAD 获取每行的下一个值,并使用 LAG 获取之前的值。然后你检查下一个值是否相同,但前一个值不同

SELECT *
FROM (
    SELECT *,LEAD([Value]) OVER (ORDER BY [Order]) nextValue,LAG([Value]) OVER (ORDER BY [Order]) prevValue
    FROM tbl
) t
WHERE nextValue = [Value]
AND (prevValue <> [Value] OR prevValue IS NULL)
ORDER BY [Order];