1

我有一个这样的 postgresql 表 userDistributions :
user_id, start_date, end_date, project_id, distribution

我需要编写一个查询,其中给定的日期范围和用户 ID 的输出应该是该给定用户每天所有分布的总和。
所以输入的输出应该是这样的:'2-2-2012' - '2-4-2012',一些用户 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 回答