sql中的值计数

时间:2019-03-24 04:36:07

标签: sql oracle

我想在当前记录的值变为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。

1 个答案:

答案 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,但重要的代码是相同的。)