【发布时间】:2020-05-28 10:09:25
【问题描述】:
我正在 PostgreSQL 10.6 中进行一些数据分析,基于此演示设置:
create table history (
registered_unix int,
requested_unix int,
alias character varying(255)
);
INSERT INTO history VALUES
(1537841388, 1537878224, '3')
, (1538093202, 1538095740, '1')
, (1538093186, 1538095740, '3')
, (1538105501, 1538107039, '2')
, (1538105501, 1538107039, '4')
, (1538205007, 1538242243, '2')
, (1538205012, NULL , '1')
, (1538105501, NULL , '1')
, (1538205007, NULL , '3')
, (1538105501, NULL , '3')
, (1538040863, NULL , '3')
, (1537985996, NULL , '3')
, (1538205007, NULL , '4')
, (1538093186, NULL , '4')
, (1538205301, NULL , '5')
, (1538105501, NULL , '5')
, (1538093186, NULL , '5');
我正在尝试计算requested_unix 为空的连续alias 行数,但仅针对第一次出现且连续出现大于或等于2 的情况。
数据按别名排序,然后是registered_unix DESC:
想要的结果:
别名 1:包括 b/c,其 2 个最近的“requested_unix”值为空。
别名 2:已跳过。请求的 unix 在其最近的行上有一个值
别名 3:包括 b/c,其 2 个最近的“requested_unix”值为空。旧的被丢弃。
别名 4:已跳过。只有 1 个最新的“requested_unix”值为 null。第二行有一个值。
别名 5:包括。连续 3 个最近的值为 null。
有各种各样的票,可以计算连续出现的次数或找到第一次出现的次数,但似乎我想将这两种方法结合起来。
【问题讨论】:
-
感谢您提供如此好的示例数据。我设置了一个 dbfiddle 供人们使用。 dbfiddle.uk/…
-
这很酷。不知道小提琴已经来到了数据库。
-
请始终公开您的 Postgres 版本。
-
旁白:
character varying(255)?见:stackoverflow.com/a/24560486/939860 -
感谢您的更新!可能只是我遇到的任何文本字段的习惯。
标签: sql postgresql greatest-n-per-group window-functions gaps-and-islands