繁体   English   中英

计算连续重复值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM