问题描述
假设我有这张桌子
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];