ticket_number | datetime | status
---------------+----------------------------+---------
1 | 2020-08-03 03:52:58.048196 | replied
1 | 2020-08-02 19:55:49.121455 | new
2 | 2020-07-30 03:52:58.048196 | pending
2 | 2020-07-28 20:15:41.213842 | replied
2 | 2020-07-26 03:52:58.482911 | new
3 | 2020-06-17 19:55:49.394628 | closed
3 | 2020-06-14 03:52:58.513141 | replied
3 | 2020-06-11 19:55:49.242859 | new
4 | 2020-05-14 07:13:50.527481 | new
5 | 2020-05-13 11:24:38.558921 | new上表由datetime订购。在订购之后,我需要按ticket_number分组,以便每个票证只出现一次,并为每个票证的最新datetime选择status。然后,我需要计算每个status的行数。
票证1的状态为答复- replied_count = 1,
票据2的状态为挂起- pending_count = 1,
机票3的状态为关闭- closed_count = 1,
机票4的状态为新的- new_count = 1,
机票5的状态为mew - new_count =2。
预期结果:
replied_count | pending_count | closed_count | new_count
---------------+-----------------+----------------+------------
1 | 1 | 1 | 2发布于 2020-08-03 18:52:51
使用
WITH cte AS ( SELECT DISTINCT
ticket_number,
FIRST_VALUE(status) OVER (PARTITION BY ticket_number
ORDER BY datetime DESC) last_status
FROM test )
SELECT last_status, COUNT(last_status)
FROM cte
GROUP BY last_status以便获得所需的垂直形式的统计数据。如果严格需要枢轴输出,则使用交叉表()或类似的方法,或者使用4种情况进行仿真。
发布于 2020-08-03 22:14:10
这应该更快,但:
SELECT status, count(*)
FROM (
SELECT DISTINCT ON (ticket_number) status
FROM test
ORDER BY ticket_number, datetime DESC
) sub
GROUP BY 1;db<>fiddle 这里
假设datetime被定义为NOT NULL。
请参见:
如果每张票有许多行,那么这些技术中的一种将会更快,但是:
每一张相关票证有一行的表ticket会有帮助。
https://dba.stackexchange.com/questions/273137
复制相似问题