[英]Count consecutive recurring values
经过几个小时的搜索、试验、错误和失败,我正在努力在互联网上找到任何关于此的信息。 我们有如下表结构:
姓名 | 事件日期时间 | 标记 |
---|---|---|
戴夫 | 2021-03-24 09:00:00 | 当下 |
戴夫 | 2021-03-24 14:00:00 | 缺席的 |
戴夫 | 2021-03-25 09:00:00 | 缺席的 |
戴夫 | 2021-03-26 09:00:00 | 缺席的 |
戴夫 | 2021-03-27 09:00:00 | 当下 |
戴夫 | 2021-03-27 14:00:00 | 缺席的 |
戴夫 | 2021-03-28 09:00:00 | 缺席的 |
戴夫 | 2021-03-29 10:00:00 | 缺席的 |
戴夫 | 2021-03-30 13:00:00 | 缺席的 |
简 | 2021-03-30 13:00:00 | 缺席的 |
基本上为人们注册事件。 我们需要提取一份报告,以查看我们连续 x 天没有联系过的人。 连续的意思是他们在数据中发生事件的日子不是连续的日历日。 此外,如果在他们缺席的某一天有礼物,则需要从他们缺席的第二天重新开始计数。
我遇到的第一个问题是获得只有缺勤的不同日期,然后第二个是获得连续缺勤天数 - 我在 MySQL 中使用变量完成了第二次,但努力将其迁移到 PostgreSQL报告是从完成的。
我想要的 output 的一个例子是:
姓名 | 事件日期时间 | 标记 | ConsecCount |
---|---|---|---|
戴夫 | 2021-03-24 09:00:00 | 当下 | 0 |
戴夫 | 2021-03-24 14:00:00 | 缺席的 | 0 |
戴夫 | 2021-03-25 09:00:00 | 缺席的 | 1 |
戴夫 | 2021-03-26 09:00:00 | 缺席的 | 2 |
戴夫 | 2021-03-27 09:00:00 | 当下 | 0 |
戴夫 | 2021-03-27 14:00:00 | 缺席的 | 0 |
戴夫 | 2021-03-28 09:00:00 | 缺席的 | 1 |
戴夫 | 2021-03-29 10:00:00 | 缺席的 | 2 |
戴夫 | 2021-03-30 13:00:00 | 缺席的 | 3 |
简 | 2021-03-30 13:00:00 | 缺席的 | 0 |
该表目前有 639931 条记录,它们是自 10 月 1 日以来生成的,并将继续以这种速度增长。
任何帮助或建议从哪里开始都会很棒。
您可以通过按人员对行进行编号,然后使用横向连接为每一行查询上一个“当前”行来获得所需的结果。
WITH with_row_numbers AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY EventDateTime)
FROM events e
)
SELECT
t1.Name,
t1.EventDateTime,
t1.Mark,
GREATEST(0, t1.ROW_NUMBER - COALESCE(sub.prev_present_row_number, 0) - 1) AS ConsecCount
FROM with_row_numbers AS t1
CROSS JOIN LATERAL (
SELECT MAX(row_number) AS prev_present_row_number
FROM with_row_numbers t2
WHERE t2.Name = t1.Name
AND t2.EventDateTime <= t1.EventDateTime
AND t2.Mark = 'Present'
) sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.