【问题标题】:Find consecutive numbers in groups in SQL在 SQL 中查找组中的连续数字
【发布时间】:2018-03-25 15:27:47
【问题描述】:

我需要在 SQL 中按组查找连续的数字。

示例: 表1

   id  | group   | result (group id)
-------+---------+-----------------------------
    1  |   a     |  1
    2  |   a     |  1
    3  |   a     |  1
    4  |   a     |  1
    5  |   a     |  1
    8  |   a     |  2
   10  |   a     |  3
   13  |   a     |  4
   14  |   a     |  4
   15  |   a     |  4
   16  |   a     |  4
   20  |   a     |  5
    2  |   b     |  1
    3  |   b     |  1
    4  |   b     |  1
    5  |   b     |  1
    8  |   b     |  2
   10  |   b     |  3
   13  |   b     |  4
   16  |   b     |  5
   20  |   b     |  6

我找到了这个解决方案 (Group by numbers that are in sequence),但我不能为团体保留它

WITH firstrows AS
 (SELECT id, ROW_NUMBER() OVER (ORDER BY id) groupid
  FROM Table1 a
  WHERE id - 1 NOT IN (SELECT b.id FROM Table1 b)
 )
SELECT id, 
    (SELECT MAX(b.groupid)
     FROM firstrows b
     WHERE b.id <= a.id
    ) groupid
FROM Table1 a 

【问题讨论】:

  • 请同时包含预期的输出。
  • 为什么ID 5的结果是2?那不应该包含在 1 组中吗?
  • 抱歉,数据已更正!

标签: sql sql-server


【解决方案1】:

还有一个使用lag()窗口函数的替代解决方案:

select id, grp, sum(mark) over (partition by grp order by id)
from (
  select 
    id, grp, 
    case when id - 1 = lag(id) over (partition by grp order by id) then 0 else 1 end as mark
  from my_table
  ) s;

SqlFiddle.中测试它

【讨论】:

    【解决方案2】:

    也许是另一种选择

    示例

    Select id
          ,[group]
          ,result = dense_rank() over (Partition by [group] order by grp)
     From ( 
           Select *
                 ,Grp = id - row_number() over (Partition by [group] order by id)
            From  YourTable
           ) A
     Order by [group],id
    

    退货

    id  group   result
    1   a       1
    2   a       1
    3   a       1
    4   a       1
    5   a       1
    8   a       2
    10  a       3
    13  a       4
    14  a       4
    15  a       4
    16  a       4
    20  a       5
    2   b       1
    3   b       1
    4   b       1
    5   b       1
    8   b       2
    10  b       3
    13  b       4
    16  b       5
    20  b       6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-18
      • 2022-11-02
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 2017-05-23
      相关资源
      最近更新 更多