sql - 来自 postgresql 的时间数据

标签 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 查询来做到这一点吗?

最佳答案

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

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这两个差异地址,所以它有效。

关于sql - 来自 postgresql 的时间数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50540703/

相关文章:

mysql - 在 mysql 中查找四月中缺失的日期

postgresql - 最近非空列的总和(带有 "ignore nulls"的窗口函数)

ruby-on-rails - 如何将 Heroku PG 转储导入本地机器

java - 错误: column is of type bit but expression is of type boolean

sql - 获取 SQL Server 中某个字段的 "And"操作

sql - MySQL 将当前数据库与备份 SQL 文件合并

sql - 从表中选择连续范围

sql - 标记不连续的日期范围

mysql - 如果表中的所有列都是某个唯一键的一部分,可以吗?

mysql - 当值之间的差距大于 x 时如何计算出现次数