来自postgresql的时间顺序数据

时间:2018-05-26 08:06:51

标签: sql postgresql gaps-and-islands

我有一个表Table1,其中包含两列:time:datetimeaddress: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 :(得分:2)

这是一种使用行数方法差异的方法:

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;

Demo

此方法使用技巧来分隔地址记录的孤岛。这两个行号让我们检测到这些岛,因为每个岛的行数差异总是相同的。但是对于多个地址可能会出现相同的差异。但是,由于我们最终GROUP BY这些差异地址,因此无效。