Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sql删除零序之前的时间序列_Sql_Subquery_Window Functions_Amazon Athena - Fatal编程技术网

使用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