#sql #sqlite #gaps-and-islands
#sql #sqlite #пробелы и острова
Вопрос:
У меня есть таблица, подобная:
id number owner
47 100 1
48 101 1
49 102 1
50 103 2
51 104 2
52 105 2
53 106 1
54 107 1
55 108 2
56 109 2
57 110 2
Как сгруппировать по непрерывному диапазону номера и владельца, чтобы получить результат, подобный:
from_number to_number owner
100 102 1
103 105 2
106 107 1
108 110 2
Я пробовал: SELECT MIN(number), MAX(number), owner FROM table GROUP BY owner
, но получил результат:
MIN(number) MAX(number) owner
100 107 1
103 110 2
Комментарии:
1. Я изучаю SQL и использую SQLite в качестве изолированной среды
Ответ №1:
Это проблема типа «групп и островов». Вы можете сделать это, вычитая последовательность из number
. Разница постоянна, когда number
s являются последовательными:
select owner, min(number) as from_number, max(number) as to_number
from (select t.*,
row_number() over (partition by owner order by number) as seqnum
from t
) t
group by owner, (number - seqnum);
Комментарии:
1. Спасибо! Но не могли бы вы объяснить, что
(number - seqnum)
означает и как это работает, пожалуйста?2. @Googlom . , , Который вычитает последовательность из чисел. Запустите подзапрос, и вы увидите, как это определяет нужные вам группы.
Ответ №2:
вы можете попробовать сгенерировать номер двух строк и взять их разницу
select owner, min(number) as min_number, max(number) as max_number
from (select a.*,
row_number() over (partition by owner order by number) as rn1,
row_number() over(order by number) rn2
from table_name a
) t
group by owner, (rn2 - rn1);