SQL идентификаторы последовательности групп и их подсчет (sqlServer) - PullRequest
0 голосов
/ 05 марта 2020

Простой вопрос: Следующая таблица с идентификаторами

    IDS
    5
    6
    7
    8
    13
    14

Что я хочу

    MinID   MaxID   Count
    5       8       4
    13      14      2

Любая идея? CTE - мои личные предпочтения

Ответы [ 5 ]

2 голосов
/ 05 марта 2020

Простой метод использует 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 являются последовательными.

0 голосов
/ 05 марта 2020

Вы также можете попробовать запрос ниже. Он группирует их в зависимости от диапазона.

Это поможет, даже если ваши значения не являются последовательными.

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

ПРОВЕРЬТЕ ДЕМО ЗДЕСЬ

Вы можете изменить регистр на основе вашей логики c для разбивки значений диапазона, т.е. 1-9 или 1-10

0 голосов
/ 05 марта 2020

Я предполагаю, что вы хотите группировать по количеству ди git.

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

Демо

0 голосов
/ 05 марта 2020

Этот пример использует переменные для минимального и максимального идентификатора:

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
0 голосов
/ 05 марта 2020

Вы можете использовать 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;
...