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) ;
此示例使用变量作为最小和最大 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
您可以根据吐出范围值的逻辑更改大小写,即1-9
或1-10
简单问题:关注单曲 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) ;
此示例使用变量作为最小和最大 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
您可以根据吐出范围值的逻辑更改大小写,即1-9
或1-10