Группировать последовательные строки на основе одного столбца - PullRequest
1 голос
/ 12 апреля 2019

Предположим, у меня есть эта таблица из результата select * from journeys:

timestamp     | inJourney (1 = true and 0 = false)
--------------------------------------------------
time1         | 1
time2         | 1
time3         | 1
time4         | 0
time5         | 0
time6         | 1
time7         | 1
time8         | 1

Ожидаемое:

timestamp     | inJourney (1 = true and 0 = false)
--------------------------------------------------
time1         | 1
time4         | 0
time8         | 1

Примечание: временная метка не важна, потому что я хочу только посчитать количество поездок.

Есть идеи, что мне делать?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Это проблема пробелов и островков, вы можете попытаться использовать оконную функцию ROW_NUMBER, чтобы получить разрыв из набора результатов, затем использовать MIN

Вы можете попробовать это.

Запрос № 1

SELECT MIN(timestamp),inJourney 
FROM (
SELECT *,
    ROW_NUMBER() OVER(ORDER BY timestamp)  - ROW_NUMBER() OVER(PARTITION BY inJourney ORDER BY timestamp) grp
  FROM journeys
) t1
GROUP BY grp,inJourney 
ORDER BY MIN(timestamp);

| min   | injourney |
| ----- | --------- |
| time1 | 1         |
| time4 | 0         |
| time6 | 1         |

Посмотреть на БД Fiddle

2 голосов
/ 12 апреля 2019

Это проблема пробелов и островков. Используйте разницу row_number():

select injourney, min(timestamp), max(timestamp)
from (select t.*,
             row_number() over (order by timestamp) as seqnum,
             row_number() over (partition by injourney, order by timestamp) as seqnum_i
      from t
     ) t
group by injourney, (seqnum - seqnum_i)
order by min(timestamp);
...