3

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

单位 | 状态 | 天
1 | 开 | 2016 年 3 月 10 日
2 | 开 | 2016 年 3 月 10 日
3 | 开 | 2016 年 3 月 10 日
4 | 开 | 2016 年 3 月 10 日
1 | 关闭 | 2016 年 3 月 11 日
2 | 开 | 2016 年 3 月 11 日
3 | 开 | 2016 年 3 月 11 日
4 | 开 | 2016 年 3 月 11 日
.
.
.

我想查询哪些单位在过去 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 > '08 Sept 2016'' 不能在本地工作,有一些内部函数用于比较和更新日期。这只是为了解释的目的。

4

2 回答 2

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;
于 2016-09-15T19:51:58.253 回答
1

戈登,感谢您的回答,您的第二个查询应该有效。小修正 -date >= 应该是day >=

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

如果每天每个单元有可能有超过 1 条记录,如果Off每天至少报告一次(即使有一些On报告),Gordon 的查询将报告该单元已死亡。如果您想要单位仅Off在过去 7 天内报告的逻辑,这里有另一种选择

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;
于 2016-09-17T10:26:19.030 回答