SQL 对序列 ID 进行分组并对其进行计数 (sqlServer)

SQL group sequence ids and count them (sqlServer)

简单问题:关注单曲 table 和 ID

    IDS
    5
    6
    7
    8
    13
    14

我想要的

    MinID   MaxID   Count
    5       8       4
    13      14      2

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

您可以使用 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;

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

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

Demo

此示例使用变量作为最小和最大 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

一个简单的方法使用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 之间的差异是常数。

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

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

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