我有一张类似于下面的表格:
+-------------------------+
¦ ID ¦ Date ¦ Balance ¦
¦----+----------+---------¦
¦ A ¦ 20200620 ¦ 150 ¦
¦ A ¦ 20200621 ¦ -130 ¦
¦ A ¦ 20200621 ¦ -140 ¦
¦ A ¦ 20200621 ¦ -200 ¦
¦ A ¦ 20200622 ¦ 200 ¦
¦ A ¦ 20200622 ¦ 300 ¦
¦ B ¦ 20200621 ¦ 350 ¦
¦ B ¦ 20200621 ¦ 400 ¦
¦ B ¦ 20200621 ¦ -150 ¦
¦ B ¦ 20200622 ¦ -200 ¦
¦ B ¦ 20200622 ¦ -300 ¦
¦ B ¦ 20200623 ¦ -400 ¦
¦ B ¦ 20200623 ¦ -500 ¦
+-------------------------+
我需要为reach id和每个不同日期(包括计算中的日期本身)计算“余额<0”的连续天数。每个id在给定的日期中可能有几个余额,要么是正数,要么是负数。即使某一天有一个余额是负数,查询也应该考虑到这一天。输出结果应类似下表:
+--------------------------------------------+
¦ ID ¦ Date ¦ Number_of_Consecutive_Days ¦
¦----+----------+----------------------------¦
¦ A ¦ 20200620 ¦ Null ¦
¦----+----------+----------------------------¦
¦ A ¦ 20200621 ¦ 1 ¦
¦----+----------+----------------------------¦
¦ A ¦ 20200622 ¦ 1 ¦
¦----+----------+----------------------------¦
¦ B ¦ 20200621 ¦ Null ¦
¦----+----------+----------------------------¦
¦ B ¦ 20200622 ¦ 2 ¦
¦----+----------+----------------------------¦
¦ B ¦ 20200623 ¦ 3 ¦
+--------------------------------------------+
你能给我一个计算方法吗?非常感谢。
2条答案
按热度按时间wgx48brx1#
请注意,日期之间的任何间隔将被视为连续天数。
若要将缺少的日期视为非连续日期,请尝试:
https://rextester.com/nkbzg48737
bf1o4zei2#
这是一种与过滤有关的间隙和孤岛问题。这里有一种方法:
这是通过计算只有负余额的天数来实现的。然后从日期中减去一个序列号。在相邻的几天里,这是不变的——因此在外部的差异
row_number()
.编辑:
如果您只想计算截至给定日期任何负余额的天数,可以使用: