使用 sql 删除零序列之前的时间序列
Remove the time series before sequence of zero using 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
所以我希望过滤数据仅显示在我们在时间序列中拥有的最终零序列之后,在这种情况下我只想获取 202 年 2 月 8 日之后的数据。
这个我试过了
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 并删除之前的所有内容。
我还想在 table 中按顺序显示最终零后 2 天的结果。
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);
您可以使用 window 函数:
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
两天后开始,这很容易适应 0
:
select day, data
from (
select t.*, 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
我有一个时间序列如下:
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
所以我希望过滤数据仅显示在我们在时间序列中拥有的最终零序列之后,在这种情况下我只想获取 202 年 2 月 8 日之后的数据。 这个我试过了
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 并删除之前的所有内容。
我还想在 table 中按顺序显示最终零后 2 天的结果。
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);
您可以使用 window 函数:
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
两天后开始,这很容易适应 0
:
select day, data
from (
select t.*, 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