将重复的连续事件计为 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_name
s.
最后按各组汇总:
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。
我有一个包含员工姓名、入职 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_name
s.
最后按各组汇总:
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。