我有下表的前三个字段。我想计算金额连续大于0的天数(“days”字段)。
| 键|日期|数量|天|
| - ------|- ------|- ------|- ------|
| 1个|二〇二三年一月二十三日|无|无|
| 1个|2023年1月22日|十个|第二章|
| 1个|2023年1月21日|二十个|1个|
| 1个|2023年1月20日|无|无|
| 1个|2023年1月19日|无|无|
| 1个|2023年1月18日|无|无|
| 1个|2023年1月17日|三个|1个|
| 1个|2023年1月16日|无|无|
我已经尝试了一些windows功能使用this link。没有添加和重置为1,如果以前的数额是0。
我的代码:
case when f.amount > 0
then SUM ( DATE_PART('day',
date::text::timestamp - previou_bus_date::text::timestamp )
) OVER (partition by f.key
ORDER BY f.date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW )
else 0
end as days
2条答案
按热度按时间4ioopgfo1#
另一种选择,你可以使用两个
row_number
之间的差异的方法如下:See demo
eimct9ow2#
只要您需要计算非空金额的 * 连续 * 值,这个问题就属于间隙和岛类问题。
您可以通过3个步骤可靠地解决此问题:
SUM
),以创建分区,并观察其上连续值的数量ROW_NUMBER
),对步骤2中生成的每个分区中的非空连续金额进行排名检查here演示。
如果您的数据在日期上有漏洞(一些缺失的记录,使得金额的连续性不再有效),您应该在步骤1中添加进一步的条件,在步骤1中创建更改分区的标志。
分区应更改:
查看here演示。