1

次のようなpostgresqlテーブルuserDistributionsが
user_id, start_date, end_date, project_id, distribution

あります。特定の日付範囲とユーザーIDの出力が、その特定のユーザーの毎日のすべての分布の合計になるクエリを作成する必要があります。
したがって、入力の出力は次のようになります: '2-2-2012' - '2-4-2012', some user id :
Date SUM(Distribution)
2-2-2012 12
2-3-2012 15
2-4-2012 34

ユーザーは多くのプロジェクトで配布を行っているため、すべてのプロジェクトの配布を毎日合計し、その合計をその日に対して出力する必要があります。

私の問題は、何に対してグループ化する必要があるかです。(start_date と end_date の代わりに) 日付としてフィールドがあれば、次のように書くこともできます
select date, SUM(distributions) from userDistributions group by date;
が、この場合はどうすればよいか困っています。助けてくれてありがとう。

4

2 に答える 2

4

generate_series次のような日付を生成するために使用します。

select dt.d::date, sum(u.distributions)
from userdistributions u
join generate_series('2012-02-02'::date, '2012-02-04'::date, '1 day') as dt(d)
  on dt.d::date between u.start_date and u.end_date
group by dt.d::date

あなたの日付形式はあいまいなので、ISO 8601 に変換するときに推測します。

于 2012-04-19T21:46:13.367 に答える
2

これは@muの答えによく似ています。
ただし、一致しない日をカバーするには、次を使用する必要がありますLEFT JOIN

SELECT d.d::date, sum(u.distributions) AS dist_sum
FROM   generate_series('2012-02-02'::date, '2012-02-04'::date, '1 day') AS d(d)
LEFT   JOIN userdistributions u ON d.d::date BETWEEN u.start_date AND u.end_date
GROUP  BY 1
于 2012-04-19T22:07:23.927 に答える