将重复的连续事件计为 postgresql 中的组

Count repeating consecutive events as groups in postgresql

我有一个包含员工姓名、入职 ID 和入职时间的 PostgreSQL 数据集。这些在几行中重复,具体取决于员工打卡的次数。我想做的是为每个员工对连续的条目进行分组并计算条目数。

输入

entry_id    emp_name        entry_time
100         John Doe        18/10/2021
101         Mark Foo        18/10/2021
102         Angie Genie     19/10/2021
103         Angie Genie     19/10/2021
104         Angie Genie     19/10/2021
105         John Doe        20/10/2021
106         John Doe        20/10/2021
107         Angie Genie     21/10/2021
108         Angie Genie     21/10/2021
109         Mark Foo        22/10/2021
110         Mark Foo        22/10/2021
111         Mark Foo        23/10/2021
112         Mark Foo        24/10/2021

期望输出

emp_name            last entry_time     no of entries
John Doe            18/10/2021          1
Mark Foo            18/10/2021          1
Angie Genie         19/10/2021          3
John Doe            20/10/2021          2
Angie Genie         21/10/2021          2
Mark Foo            24/10/2021          4

我曾尝试使用间隙和岛方法将连续 emp_names 分配到组中,以使我能够获得条目计数,但我无法这样做。我希望像下面这样分配组,但到目前为止没有任何效果。

entry_id        emp_name            entry_time          group       no of entries
100             John Doe            18/10/2021          1           1
101             Mark Foo            18/10/2021          2           1
102             Angie Genie         19/10/2021          3           3
103             Angie Genie         19/10/2021          3           3
104             Angie Genie         19/10/2021          3           3
105             John Doe            20/10/2021          4           2
106             John Doe            20/10/2021          4           2
107             Angie Genie         21/10/2021          5           2
108             Angie Genie         21/10/2021          5           2
109             Mark Foo            22/10/2021          6           4
110             Mark Foo            22/10/2021          6           4
111             Mark Foo            23/10/2021          6           4
112             Mark Foo            24/10/2021          6           4

这在 PostgreSQl 中可行吗?任何帮助表示赞赏。 谢谢。

您可以使用 window 函数 LAG() 检查每行的前一个 emp_name 并使用 window 函数 SUM() 创建组连续重复 emp_names.
最后按各组汇总:

SELECT emp_name, 
       MAX(entry_time) last_entry_time,
       COUNT(*) no_of_entries 
FROM (
  SELECT *, SUM(flag) OVER (ORDER BY entry_time, entry_id) grp
  FROM (
    SELECT *, (emp_name <> LAG(emp_name, 1, '') OVER (ORDER BY entry_time, entry_id))::int flag
    FROM tablename
  ) t
) t
GROUP BY grp, emp_name
ORDER BY grp;

参见demo