0

次の SQL クエリがあります。

SELECT date(created_at), sum(duration) as total_duration 
FROM "workouts" WHERE "workouts"."user_id" = 5 AND "workouts"."category" = 'All' 
GROUP BY date(created_at) ORDER BY date(created_at) ASC

しかし、ワークアウトのIDも照会したいので、これを試しました:

SELECT id as id, date(created_at), sum(duration) as total_duration 
FROM "workouts" WHERE "workouts"."user_id" = 5 AND "workouts"."category" = 'All' 
GROUP BY id, date(created_at) ORDER BY date(created_at) ASC

ただし、これにより、日付句によるグループが機能しなくなります (つまり、特定の日付のすべてのワークアウトの期間を合計しません)。これは、複数のレコードを持つ日付に対して 1 つの ID を持つことができないためだと思います。返された特定のレコードに複数のワークアウトが関連付けられている場合でも、ID を返す方法はありますか?

たとえば、誰かが昨日 3 回のワークアウトを行い、それぞれが 40 分間継続した場合、クエリは 120 分 (特定の日付の継続時間の合計) を返しますが、その日のワークアウトの各 ID も返しますか?

または、クエリ自体でこれを行うのではなく、アプリケーションで行う必要がありますか?

助けてくれてありがとう。

4

4 に答える 4

1

サブクエリを使用して結果を取得できるはずです。

SELECT w1.id,
  w2.created_at
  coalesce(w2.total_duration, 0) total_duration
FROM "workouts" w1
INNER JOIN
(
  SELECT date(created_at) created_at, 
    sum(duration) as total_duration 
  FROM "workouts" 
  WHERE "workouts"."user_id" = 5 
    AND "workouts"."category" = 'All' 
  GROUP BY date(created_at)
) w2
  on w1.created_at = w2.created_at
ORDER BY w2.created_at;

ワークアウトのない ID も含めてすべての ID を返したい場合は、LEFT JOIN を使用できます。

于 2013-05-08T21:32:48.930 に答える
1

MySQLにはそのためのgroup_concat(id)がありますが、一般的に「sql」について尋ねます。

編集:postgresqlの場合、Postgresql GROUP_CONCATと同等のものを見つけましたか?

SELECT array_agg(id) as id_array, date(created_at), sum(duration) as total_duration 
FROM "workouts" WHERE "workouts"."user_id" = 5 AND "workouts"."category" = 'All' 
GROUP BY date(created_at) ORDER BY date(created_at) ASC
于 2013-05-08T21:33:19.920 に答える
1

これには Windows 関数を使用できます。

SELECT id as id, date(created_at), sum(duration) as total_duration,
       sum(sum(duration)) over (partition by date(created_at)) as DaysTotal
FROM "workouts"
WHERE "workouts"."user_id" = 5 AND "workouts"."category" = 'All' 
GROUP BY id, date(created_at)
ORDER BY date(created_at) ASC

これにより、その日の合計である別の列が追加されます。

于 2013-05-08T21:34:27.797 に答える