【问题标题】:Get the row with first occurrence of repetitive value in column using SQL Server使用 SQL Server 获取列中第一次出现重复值的行
【发布时间】:2021-05-02 03:25:37
【问题描述】:

假设我有这张桌子

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

如何确定重复开始的行?

谢谢

【问题讨论】:

  • 如:当由Order 排序时,下一行具有相同Value 的第一行?到目前为止,您尝试过什么?
  • 或者你的意思是每个重复的第一行?

标签: sql-server repeat find-occurrences


【解决方案1】:

您可以将WITH TIES 选项与窗口函数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

【讨论】:

    【解决方案2】:

    如果您想要第一行出现重复,您可以使用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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      相关资源
      最近更新 更多