我想在当前记录的值变为0时显示值的计数。
我对sql不太熟悉,尝试进行自我联接,但dint起作用了
请参见下面的输入记录。
Date, value
2018-12, 0
2018-11, 1
2018-10, 1
2018-09, 1
2018-08, 0
2018-07, 0
2018-06, 1
2018-05, 0
2018-04, 1
2018-03, 0
2018-02, 0
2018-01, 1
输出罩如下。
Date, value, Count
2018-12, 0 , 3
2018-11, 1 , 2
2018-10, 1 , 1
2018-09, 1 , 0
2018-08, 0 , 0
2018-07, 0 , 2
2018-06, 1 , 1
2018-05, 1 , 0
2018-04, 0 , 0
2018-03, 0 , 0
2018-02, 0 , 1
2018-01, 1 ,null
对于2018-12年的第一笔记录,我们需要跟踪0第一次出现的时间,一旦出现0,我们需要在此处停止计数。
在这种情况下,0表示2018-08,0表示第一个记录2018-12,0。因此我们需要在2018-12年度保持3个数字,即0。
对于2018-11年,我们在两个值之后得到1,所以我们需要保持2。
对于2018-08年度,我们立即得到0,所以0需要保留。
对于2018-07年度,0是我们获得两个值之后的0,因此2需要保持这种状态。
我不太擅长编写sql,请帮助解决这种情况下如何编写sql。
答案 0 :(得分:1)
您需要分配一个分组。分组似乎是每行或之后的0。您可以使用累计和来计算。
然后,在每个分组中,您可以使用row_number()
进行计算:
select t.*,
(row_number() over (partition by grp order by "Date" asc) - 1) as counter
from (select t.*,
sum(case when value = 0 then 1 else 0 end) over (order by "Date" desc) as grp
from t
) t
order by "Date" desc;
我不确定为什么最早的值会是NULL
,所以我没有在逻辑中包括这个值。
Here是db <>小提琴(请注意,它使用Postgres,但重要的代码是相同的。)