postgresql 如何选择与列不为空的下一组行相等的行数?仅适用于第一组非空行?

2ledvvac  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(118)

我有一张这样的table:
| 项目|日期|折扣|收入|
| --|--|--|--|
| 椅子|2023年11月1日|null| 10 |
| 椅子|2023年11月2日|null| 10 |
| 椅子|2023年11月3日|null| 10 |
| 椅子|2023年11月4日|null| 10 |
| 椅子|2023年11月5日|null| 10 |
| 椅子|2023年11月6日|零点三十| 10 |
| 椅子|2023年11月7日|零点三十| 10 |
| 椅子|2023年11月8日|零点三十| 10 |
| 椅子|2023年9月11日|null| 10 |
我可以应用一个间隙和岛屿的技巧,以获得我想要的表的大部分:
| 项目|开始日期|结束日期(_D)|天数|折扣|收入|
| --|--|--|--|--|--|
| 椅子|2023年11月1日|2023年11月5日| 5 |null| 50 |
| 椅子|2023年11月6日|2023年11月8日| 3 |零点三十| 30 |
| 椅子|2023年9月11日|2023年9月11日| 1 |null| 10 |
然而,我真正想要的是just第一个null集合等于numofdays作为下面的非null集合:
| 项目|开始日期|结束日期(_D)|天数|折扣|收入|
| --|--|--|--|--|--|
| 椅子|2023年11月3日|2023年11月5日| 3 |null| 30 |
| 椅子|2023年11月6日|2023年11月8日| 3 |零点三十| 30 |
| 椅子|2023年9月11日|2023年9月11日| 1 |null| 30 |
我想到的唯一使用的函数是LAGLEADCASE语句的组合。
有谁能帮忙吗?非常感谢。

o75abkj4

o75abkj41#

您可以在现有的Gaps和Island查询中使用WINDOW函数,如下所示:

WITH CTE as (your existing query having Gaps and Islands trick)
SELECT T.ITEM, T.START_DATE, T.END_DATE,
       CASE WHEN NULL_CHECK = 1 THEN NNOD ELSE NUMOFDAYS END AS NUMOFDAYS
  FROM 
      (SELECT T.*,
              LEAD(NUMOFDAYS) 
                   OVER (PARTITION BY ITEM ORDER BY START_DATE) AS NNOD,
              SUM(CASE WHEN DISCOUNT IS NULL THEN 1 END) 
                   OVER (PARTITION BY ITEM ORDER BY START_DATE) AS NULL_CHECK
         FROM CTE) T;

字符串

相关问题