2016-03-29 41 views
0

これはかなり一般的なSQLの質問ですが、私はPostgreSQL 9.4で他のデータベースソフトウェアを使用するオプションなしで作業しています。 。1つのSQLクエリで異なる条件の複数の集計合計

1つのクエリから複数の集計合計を返すことができるようにする必要があります。各集計は新しい行にあり、各グループは一意の時間間隔で決定されます。 WHERE time_stamp BETWEEN '2016-02-07' AND '2016-02-14'WHERE節を満たすレコードの数は不明であり、ゼロの場合があります。その場合、理想的には結果は「0」です。

(
SELECT SUM(minutes) AS min 
FROM downtime 
WHERE time_stamp BETWEEN '2016-02-07' AND '2016-02-14' 
) 
UNION ALL 
(
SELECT SUM(minutes) 
FROM downtime 
WHERE time_stamp BETWEEN '2016-02-14' AND '2016-02-21' 
) 
UNION ALL 
(
SELECT SUM(minutes) 
FROM downtime 
WHERE time_stamp BETWEEN '2016-02-28' AND '2016-03-06' 
) 
UNION ALL 
(
SELECT SUM(minutes) 
FROM downtime 
WHERE time_stamp BETWEEN '2016-03-06' AND '2016-03-13' 
) 
UNION ALL 
(
SELECT SUM(minutes)) 
FROM downtime 
WHERE time_stamp BETWEEN '2016-03-13' AND '2016-03-20' 
) 
UNION ALL 
(
SELECT SUM(minutes) 
FROM downtime 
WHERE time_stamp BETWEEN '2016-03-20' AND '2016-03-27' 
) 

結果:これは私がこれまで働いてきたものである

 min 
---+----- 
1 | 119 
2 | 4 
3 | 30 
4 | 
5 | 62 
6 | 350 

そのクエリは、私が欲しいほとんど正確な結果を取得します。確かに私は結果と必要なものを正確に行うことができます。レコードのない時間範囲は空白ですが、それは予測可能でしたが、「0」を選択するのに対し、ソフトウェアの空白行は考慮することができます。

しかし、それが表す6週間はひどいわけではありませんが、私は柔軟性があり、異なる時間帯で同じことをすることができます。毎週1週間、毎週3カ月、6カ月、毎月1年、2年など...上に書いたように、それは退屈な速さになるように感じる...例えば1週間2年間の期間は104サブクエリです。

私が後にしたのは、同じ(または同様の)結果を得るよりエレガントな方法です。

上記と同様のクエリの反復を104回(現在は6回)行うのが特に効率的な使用法であるかどうかはわかりません。

最終的に私は長くて醜いクエリを構築するのに役立つコードを書くつもりですが、より簡潔でスケーラブルなクエリを作成することはまだ素晴らしいことです。

+3

を私はあなたのクエリはあなたがそれがない何を考えていないと思います。 'BETWEEN'はインクルーシブなので、境界が含まれています。 –

答えて

1

のPostgresでは、あなたは、回のシリーズを生成することができ、その後、集約のためにこれらを使用します。

select g.dte, coalesce(sum(dt.minutes), 0) as minutes 
from generate_series('2016-02-07'::timestamp, '2016-03-20'::timestamp, interval '7 day') g(dte) left join 
    downtime dt 
    on dt.timestamp >= g.dte and dt.timestamp < g.dte + interval '7 day' 
group by g.dte 
order by g.dte; 
+0

ありがとうございます。私はあなたの答えを受け入れる前に私はそれを使用するための瞬間を許可しますが、これは私が欲しかったものと思われる。 – Snowman

関連する問題