我有一个包含日期条目的SQL表,其中有三列:日期、项目和状态。该表如下所示:
| 日期|项目|地位|
| - ------|- ------|- ------|
| 2023年1月1日|A类|在|
| 2023年1月1日|乙|在|
| 2023年1月1日|C级|关闭|
| 2023年1月2日|A类|在|
| 2023年1月2日|乙|关闭|
| 2023年1月2日|C级|关闭|
| 2023年1月2日|D级|在|
| 2023年1月3日|A类|在|
| 2023年1月3日|乙|关闭|
| 2023年1月3日|C级|关闭|
| 2023年1月3日|D级|关闭|
查看最近的条目时,我需要按项目、最新日期和状态以及状态未更改的条目的累计计数进行分组。例如,我要查找的输出将是:
| 最新日期|项目|当前状态|当前的天数|
| - ------|- ------|- ------|- ------|
| 2023年1月3日|A类|在|三个|
| 2023年1月3日|乙|关闭|第二章|
| 2023年1月3日|C级|关闭|三个|
| 2023年1月3日|D级|关闭|1个|
如何在PostgreSQL 13.7中获得我想要的输出?
这将返回最新日期、项目和当前状态,但不会正确计算项目处于当前状态的天数:
WITH CTE AS (
SELECT
item,
date,
status,
LAG(status) OVER (PARTITION BY item ORDER BY date) AS prev_status,
ROW_NUMBER() OVER (PARTITION BY item ORDER BY date DESC) AS rn
FROM
schema.table
)
SELECT
MAX(date) AS latest_date,
item,
status AS current_status,
SUM(CASE WHEN prev_status = status THEN 0 ELSE 1 END)
OVER (PARTITION BY item ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS number_of_days
FROM
CTE
WHERE
rn = 1
GROUP BY
item, status, prev_status, date
ORDER BY
item
2条答案
按热度按时间flseospp1#
使用
cte
构建连续状态的运行:See fiddle.
dwthyt8l2#
根据您的评论,您希望找到连续状态
where status = last status value
的最大计数,这变成了一个间隙和岛问题。这可以使用两个row_numbers之间的差和last_value
函数来解决,如下所示:See demo