generate_series と複数の結合を使用して、postgresql 9.2.4 に複雑な (私にとって) SQL クエリがあります。エクササイズ テーブルから特定の日のすべてのエクササイズの担当者を合計し、それらのエクササイズが現在のユーザーによって行われたワークアウトに属していることを確認する必要があります。最後に、そのテーブルをシリーズに結合して、欠落している日付を表示する必要があります (generate_series を使用)。
私の考えでは、from 句でシリーズを選択し、シリーズをサブクエリに結合して、エクササイズ テーブルとワークアウト テーブルの間の内部結合の結果を得ることを考えました。たとえば、次のクエリがあります。
SELECT
DISTINCT date_trunc('day', series.date)::date as date,
sum(COALESCE(reps, 0)) OVER WIN,
array_agg(workout_id) OVER WIN as ids
FROM (
select generate_series(-22, 0) + current_date as date
) series
LEFT JOIN (
exercises INNER JOIN workouts
ON exercises.workout_id = workouts.id
)
ON series.date = exercises.created_at::date
WINDOW
WIN AS (PARTITION BY date_trunc('day', series.date)::date)
ORDER BY date ASC;
これにより、次の出力が得られます。
date | sum | ids
------------+-----+---------------------------------------------------------
2013-04-27 | 0 | {NULL}
2013-04-28 | 432 | {49,48,47,46,45,44,43,42,41,38,37,36,36,36,36,35,34,33}
2013-04-29 | 0 | {NULL}
2013-04-30 | 20 | {50}
2013-05-01 | 0 | {NULL}
2013-05-02 | 0 | {NULL}
2013-05-03 | 0 | {NULL}
2013-05-04 | 0 | {NULL}
2013-05-05 | 0 | {NULL}
2013-05-06 | 0 | {NULL}
2013-05-07 | 40 | {51,51}
2013-05-08 | 0 | {NULL}
2013-05-09 | 0 | {NULL}
2013-05-10 | 0 | {NULL}
2013-05-11 | 0 | {NULL}
2013-05-12 | 0 | {NULL}
2013-05-13 | 0 | {NULL}
2013-05-14 | 0 | {NULL}
2013-05-15 | 0 | {NULL}
2013-05-16 | 20 | {52}
2013-05-17 | 0 | {NULL}
2013-05-18 | 0 | {NULL}
2013-05-19 | 0 | {NULL}
(23 rows)
ただし、特定の条件でフィルタリングしたい:
WHERE workouts.user_id = 5
例えば。
しかし、上記の条件で WHERE 句をクエリに入れると、出力は次のようになります。
date | sum | ids
------------+-----+---------------------------------------------------------
2013-04-28 | 432 | {49,48,47,46,45,44,43,42,41,38,37,36,36,36,36,35,34,33}
2013-04-30 | 20 | {50}
2013-05-07 | 40 | {51,51}
2013-05-16 | 20 | {52}
(4 rows)
シリーズは消えます。
user_id でフィルタリングしてシリーズを保持するにはどうすればよいですか? どんな助けでも大歓迎です。