我有一张表格,其中包含可以简化为给定单位的每日报告:
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月''将无法原生工作,有一些内部函数用于比较和更新日期。这只是出于解释目的。
答案 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;