Группировать последовательные повторяющиеся значения sqlite

#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   |