使用 SQL 服务器获取列中第一次出现重复值的行
Get the row with first occurrence of repetitive value in column using SQL Server
假设我有这个 table
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 之后的下一行。所有这些行的 Value
列中都有一个 pig
。
如何确定重复开始的行?
谢谢
您可以将 WITH TIES
选项与 window 函数 lead()
和 row_number()
一起使用
例子
Declare @YourTable Table ([Id] varchar(50),[Order] int,[Value] varchar(50)) Insert Into @YourTable Values
('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')
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];
如果您想要第一行 every 重复,您可以使用 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];
假设我有这个 table
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 之后的下一行。所有这些行的 Value
列中都有一个 pig
。
如何确定重复开始的行?
谢谢
您可以将 WITH TIES
选项与 window 函数 lead()
和 row_number()
例子
Declare @YourTable Table ([Id] varchar(50),[Order] int,[Value] varchar(50)) Insert Into @YourTable Values
('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')
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];
如果您想要第一行 every 重复,您可以使用 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];