检查IF子句中的前X行

时间:2016-09-15 19:47:29

标签: sql snowflake snowflake-datawarehouse

我有一张表格,其中包含可以简化为给定单位的每日报告:

Unit | Status | Day
1    | On     | 10 March 2016
2    | On     | 10 March 2016
3    | On     | 10 March 2016
4    | On     | 10 March 2016
1    | Off    | 11 March 2016
2    | On     | 11 March 2016
3    | On     | 11 March 2016
4    | On     | 11 March 2016
.
.
.

我想查询过去7天哪些单位报告'关闭',但不确定如何做到这一点。我希望查询类似于

SELECT 
    Unit, 
    Status,
    CASE WHEN([all 7 previous days were 'Off']) THEN 'Dead' ELSE 'Alive' END
FROM unit_table a
WHERE Day = '15 Sept 2016'

我怎么能做那个IF条款?像

这样的东西
CASE WHEN(SELECT COUNT(SELECT * FROM unit_table b WHERE DAY > '08 Sept 2016' AND Status = 'Off' AND b.Unit = a.Unit) > 7) 

可能?

我知道'DAY> '2016年9月''将无法原生工作,有一些内部函数用于比较和更新日期。这只是出于解释目的。

2 个答案:

答案 0 :(得分:1)

嗯,我在想这样的事情:

select u.unit
from unit_table u
where date >= '2016-09-15' - interval '6 day'
group by u.unit
having count(distinct case when status = 'Off' then day end) = 7;

我对Snowflake并不熟悉,但语法可能如下:

select u.unit
from unit_table u
where date >= dateadd(day, -6, CURRENT_DATE)
group by u.unit
having count(distinct case when u.status = 'Off' then day end) = 7;

答案 1 :(得分:1)

戈登,谢谢你的回答,你的第二个问题应该有效。小修正 - date >=应该是day >=

DISTINCT的查询通常较慢(由于重复删除),因此如果保证一个单位/天的组合只有1个记录,删除它将起作用。

如果每天每个单元的记录可能超过1条,如果每天至少报告一次Off,则该单位会将该单位报告为已​​死(即使有On次报告)。如果想要在过去7天内该单位仅报告Off的逻辑,则可以选择

select u.unit
from unit_table u
where day >= dateadd(day, -6, CURRENT_DATE)
group by u.unit
having count(nullif(u.status, 'Off')) = 0;