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

ゴードン、答えてくれてありがとう、あなたの2番目のクエリはうまくいくはずです。小さな修正 -date >= おそらくそうあるべきday >=です。

を使用したクエリはDISTINCT(重複排除のために)遅くなることが多いため、1 つのユニット/日の組み合わせに対して 1 つのレコードしかないことが保証されている場合は、それを削除しても問題ありません。

ユニットごとに 1 日 1 件以上のレコードを持つことが可能である場合、Gordon のクエリは、ユニットがOff1 日に少なくとも 1 回報告された場合 (いくつかのOnレポートがあったとしても)、ユニットが死亡していると報告します。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 に答える