Хронологические данные из postgresql - PullRequest
0 голосов
/ 26 мая 2018

У меня есть таблица Table1 с двумя столбцами: time:datetime, address:varchar с такими данными:

2018-01-03-11:25:30, A
2018-01-04-14:34:43, A
2018-01-08-06:25:36, A
2018-01-08-11:14:30, B
2018-01-09-19:10:21, B
2018-01-10-10:18:50, B
2018-01-12-23:17:30, A
2018-01-13-06:24:40, A
2018-01-14-15:18:10, C
2018-01-18-13:44:20, C

Я хочу извлечь хронологические данные из Table1, например:

A, 3, 2018-01-03-11:25:30, 2018-01-08-06:25:36
B, 3, 2018-01-08-11:14:30, 2018-01-10-10:18:50
A, 2, 2018-01-12-23:17:30, 2018-01-13-06:24:40
C, 2, 2018-01-14-15:18:10, 2018-01-18-13:44:20

можно ли это сделать с помощью SQL-запроса?

1 Ответ

0 голосов
/ 26 мая 2018

Вот один подход, использующий метод разности номеров строк:

WITH cte AS (
    SELECT *,
        ROW_NUMBER() OVER (ORDER BY time) -
        ROW_NUMBER() OVER (PARTITION BY address ORDER BY time) rn
    FROM yourTable
)

SELECT
    address,
    COUNT(*) AS cnt,
    MIN(time) AS start,
    MAX(time) AS end
FROM cte
GROUP BY
    address, rn
ORDER BY
    start;

Демо

Этот метод использует трюк для разделенияострова адресных записей.Два номера строки позволяют нам обнаружить эти острова, потому что разница номеров строк для каждого острова всегда будет одинаковой.Но одна и та же разница может появиться для нескольких адресов.Тем не менее, поскольку мы в конечном итоге GROUP BY оба эти различий и адрес, это работает.

...