来自 postgresql 的时间顺序数据
Chronological data from postgresql
我有一个包含两列的 table 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 查询来做到这一点吗?
这是一种使用行数差异方法的方法:
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
这两个 和 的地址不同,所以它起作用了。
我有一个包含两列的 table 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 查询来做到这一点吗?
这是一种使用行数差异方法的方法:
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
这两个 和 的地址不同,所以它起作用了。