0

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 でフィルタリングしてシリーズを保持するにはどうすればよいですか? どんな助けでも大歓迎です。

4

2 に答える 2