使用sql删除零序之前的时间序列
我有一个时间序列如下:使用sql删除零序之前的时间序列,sql,subquery,window-functions,amazon-athena,Sql,Subquery,Window Functions,Amazon Athena,我有一个时间序列如下: 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/
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
但是,这不会找到最晚的0并删除之前的所有内容
我还想在表中显示最终零序后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);
或:
您可以使用窗口功能:
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, 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
请用您正在运行的数据库标记您的问题:mysql、oracle、postgresql…?我在雅典娜运行它我想是postgresql当您提到max(t2.day)时,这是否意味着它将检查数据列以查找最大值?@user。子查询找到“代码>日期/代码>的最大值,其中值为代码>0 < /代码>。它也考虑序列吗?@用户…我不明白这个评论。它以
value=0
拾取最后一行之后的所有行。当我运行代码时,它会告诉我“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以获取在“()day0”附近使用的正确语法”。因为我的日期栏是acutlay标签,日期不是日期,请告诉我如何修复它。我把第0天改成第0天好吗。over()在oracle中,我使用的是mysql和postgresql,因此它不起作用。此外,当我在athena中使用prstgresql时,它会告诉我,在这个比例因子下,查询耗尽了资源。另一个问题是在间隔“2天”,天应该来自单个qout间隔“2”天
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