使用SQL删除零序列之前的时间序列

问题描述

我的时间序列如下:

Day.          Data 

1/1/2020.     0
2/1/2020      .2
3/1/2020      0
......       ...
1/2/2020      0
2/2/2020.     0
3/2/2020.     .2
4/2/2020.     .3
5/2/2020.     0
6/2/2020      0
7/2/2020.     0
8/2/2020      2
9/2/2020      2.4
10/2/2020     3

因此,我希望过滤器数据仅在时间序列中的最终零序列之后显示在这种情况下,我只希望在8/2/202之后获得数据。 我已经尝试过了

SELECT * FROM table where Data> 0 

这是结果:

Day.          Data 
    
    2/1/2020      .2
    ......       ...
    3/2/2020.     .2
    4/2/2020.     .3
    8/2/2020      2
    9/2/2020      2.4
    10/2/2020     3

但是,这并没有找到Lates 0并删除了之前的所有内容

我还要在表中按顺序显示最后零个零天后的结果。

Day           Data
10/2/2020     3
11/2/2020.    3.5
.....        ....

解决方法

一种方法是:

select t.*
from t
where t.day > (select max(t2.day) from t t2 where t2.value = 0);

您可以抵消这一点:

where t.day > (select max(t2.day) + interval '2' day from t t2 where t2.value = 0);

以上假设至少一行具有零。这是两个简单的修复程序:

where t.day > all (select max(t2.day) from t t2 where t2.value = 0);

或:

where t.day > (select coalesce(max(t2.day),'2000-01-01') from t t2 where t2.value = 0);
,

您可以使用窗口功能:

select day,data
from (
    select t.*,max(case when data = 0 then day end) over() day0
    from mytable t
) t
where day > day0 or day0 is null
order by day0

如果您想在上一个0之后两天开始,可以很容易地调整它:

select day,max(case when data = 0 then day end) over() day0
    from mytable t
) t
where day > day0 + interval '2 day' or day0 is null
order by day0