postgresql postgres -窗口函数-组内日期差异

ldioqlga  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

我搜索并看到了潜在的结果,但以我的技能,我无法适应他们。
我有表:
| 日期|记录状态|
| - -|- -|
| 二零二二年十月一日|打开的|
| 二○二二年十月二日|等待|
| 二零二二年十月三日|已核准|
| 二零二二年十月五日|打开的|
| 二零二二年十月六日|等待|
| 二○二二年十月八日|已核准|
| 二〇二二年十月十日|打开的|
| 二零二二年十月十二日|等待|
并且需要以“打开”开始并以“批准”结束的组中“打开”和“批准”之间的日期差。最后一个组尚未批准。其中,日期差是最后一个打开和今天之间的日期差(例如=15.10.2022)
| 日期|记录状态|组/等级|日期差异|
| - -|- -|- -|- -|
| 二零二二年十月一日|打开的|一个|2个|
| 二○二二年十月二日|等待|一个|2个|
| 二零二二年十月三日|已核准|一个|2个|
| 二零二二年十月五日|打开的|2个|三个|
| 二零二二年十月六日|等待|2个|三个|
| 二○二二年十月八日|已核准|2个|三个|
| 二〇二二年十月十日|打开的|三个|五个|
| 二零二二年十月十二日|等待|三个|五个|
然后提问:
1.如何定义组?我想可能需要一个等级,因为orig表有数千行
1.日期差异函数看起来如何,它只考虑打开和已批准的记录以及记录尚未批准的特殊情况
1.如何将此日期差异仅应用于组
非常感谢:-)

m4pnthwp

m4pnthwp1#

你的主意不错;用于管理需要使用当天的情况的CTE是您所缺少的(参见EXISTS)。

WITH RankedStatus AS (
    SELECT MyTable.*,
           DENSE_RANK() OVER (PARTITION BY RecordStatus ORDER BY Date) AS Rank
    FROM MyTable
)
SELECT RS.*,
       CASE WHEN EXISTS(SELECT FROM RankedStatus WHERE Rank = RS.Rank and RecordStatus = 'approved')
       THEN MAX(Date) OVER (PARTITION BY Rank)
       ELSE CURRENT_DATE END
       - MIN(Date) OVER (PARTITION BY Rank) AS DateDiff
FROM RankedStatus RS

相关问题