#sql #database #sqlite #window-functions #gaps-and-islands
#sql #База данных #sqlite #окно-функции #пробелы и острова
Вопрос:
У меня есть данные, которые повторяются последовательно..
A
A
A
B
B
B
A
A
A
Мне нужно сгруппировать их следующим образом
A
B
A
Каков наилучший подход для этого с использованием sqlite?
Ответ №1:
Предполагая, что у вас есть столбец, который определяет порядок строк, скажем id
, вы можете решить эту проблему с пробелами и островами с помощью оконных функций:
select col, count(*) cnt, min(id) first_id, max(id) last_id
from (
select t.*,
row_number() over(order by id) rn1,
row_number() over(partition by col order by id) rn2
from mytable t
) t
group by col, rn1 - rn2
order by min(id)
Я добавил несколько столбцов в результирующий набор, которые предоставляют больше информации о содержимом каждой группы.
Ответ №2:
Если вы определили столбец, который определяет порядок строк, например, id
, вы можете использовать функцию window LEAD()
:
select col
from (
select col, lead(col, 1, '') over (order by id) next_col
from tablename
)
where col <> next_col
Смотрите демонстрацию.
Результаты:
| col |
| --- |
| A |
| B |
| A |