【问题标题】:SQL group sequence ids and count them (sqlServer)SQL 组序列 ID 并计算它们(sqlServer)
【发布时间】:2020-03-05 10:58:17
【问题描述】:

简单问题:使用 ID 跟踪单个表

    IDS
    5
    6
    7
    8
    13
    14

我想要什么

    MinID   MaxID   Count
    5       8       4
    13      14      2

有什么想法吗? CTE 是我的个人喜好

【问题讨论】:

  • 表中没有 4 个5s,你怎么算?你是否涉及到另一个你没有提到的表?
  • 如何选择最小值、最大值或计数?您的预期结果没有意义
  • 哦……要统计一定范围内的ID吗?
  • 您提问的目的不明确。请尝试更深入地解释您的目标。

标签: sql sql-server group-by common-table-expression


【解决方案1】:

一个简单的方法使用row_number()group by

select min(id), max(id), count(*)
from (select t.*,
             row_number() over (order by id) as seqnum
      from t
     ) t
group by (id - seqnum)
order by min(id);

也就是说,如果一个数字序列和id 之间的差异是恒定的,而id 的值是连续的。

【讨论】:

  • 逻辑流畅而精彩。
【解决方案2】:

我假设您想根据位数进行分组。

select len(id) ln , min(id) , max(id) , count (*) from tab1
group by len(id) ; 

Demo

【讨论】:

    【解决方案3】:

    您可以使用lag() 查找分组并进行聚合:

    select min(ids) as minid, max(ids) as maxid, count(*) as cnt
    from (select t.*, 
                 sum(case when ids - prev_ids = 1 then 0 else 1 end) over (order by ids) as grp
          from (select t.*, lag(ids) over (order by ids) as prev_ids
                from table t
               ) t
         ) t
    group by grp;
    

    【讨论】:

      【解决方案4】:

      此示例使用变量作为最小和最大 id:

      DECLARE @minID INTEGER,
              @maxID INTEGER;
      
      SET @minID = 13;
      SET @maxID = 14;
      
      SELECT
          @maxID AS MaxID,
          @minID AS MinID,
          COUNT(*) AS "Count"
      FROM
          #ids
      WHERE
          id <= @maxID
          AND
          id >= @minID
      

      然后输出

      MaxID   MinID   Count
      14      13      2
      

      【讨论】:

        【解决方案5】:

        您也可以尝试以下查询。它根据范围将它们组合在一起。

        即使您的值不是连续的,这也会有所帮助。

        select min(id) as MinID, max(id) as MaxID, count(*) as cnt
        from (select id,case when id between 1 and 9 then '1-9'
                             when id between 10 and 19 then '10-19'
                           --when id between 20 and 29 then '20-29' & so on
                        end as Grp from your_table) g
        group by Grp
        

        CHECK DEMO HERE

        您可以根据自己的逻辑更改大小写以吐出范围值,即1-91-10

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-13
          • 1970-01-01
          • 2022-06-29
          • 2013-09-19
          • 1970-01-01
          • 2020-12-09
          相关资源
          最近更新 更多