【发布时间】:2013-03-19 10:32:36
【问题描述】:
我需要创建一个返回的 PostgreSQL 查询
- 一天
- 当天找到的对象数
重要的是每一天都出现在结果中,即使当天没有找到任何对象。 (这之前已经讨论过,但我无法在我的特定情况下让事情正常进行。)
首先,我找到了sql query to generate a range of days,我可以加入:
SELECT to_char(date_trunc('day', (current_date - offs)), 'YYYY-MM-DD')
AS date
FROM generate_series(0, 365, 1)
AS offs
结果:
date
------------
2013-03-28
2013-03-27
2013-03-26
2013-03-25
...
2012-03-28
(366 rows)
现在我正在尝试将其加入一个名为“sharer_emailshare”的表中,该表有一个“已创建”列:
Table 'public.sharer_emailshare'
column | type
-------------------
id | integer
created | timestamp with time zone
message | text
to | character varying(75)
这是我迄今为止最好的GROUP BY 查询:
SELECT d.date, count(se.id) FROM (
select to_char(date_trunc('day', (current_date - offs)), 'YYYY-MM-DD')
AS date
FROM generate_series(0, 365, 1)
AS offs
) d
JOIN sharer_emailshare se
ON (d.date=to_char(date_trunc('day', se.created), 'YYYY-MM-DD'))
GROUP BY d.date;
结果:
date | count
------------+-------
2013-03-27 | 11
2013-03-24 | 2
2013-02-14 | 2
(3 rows)
期望的结果:
date | count
------------+-------
2013-03-28 | 0
2013-03-27 | 11
2013-03-26 | 0
2013-03-25 | 0
2013-03-24 | 2
2013-03-23 | 0
...
2012-03-28 | 0
(366 rows)
如果我理解正确,这是因为我使用的是普通的(隐含的 INNER)JOIN,这是预期的行为,如 discussed in the postgres docs。
我查看了几十个 StackOverflow 解决方案,所有具有工作查询的解决方案似乎都是特定于 MySQL/Oracle/MSSQL 的,我很难将它们转换为 PostgreSQL。
询问this question 的人使用 Postgres 找到了他的答案,但将其放在了一段时间前过期的 pastebin 链接上。
我尝试切换到LEFT OUTER JOIN、RIGHT JOIN、RIGHT OUTER JOIN、CROSS JOIN,如果为空,则使用CASE 语句来插入另一个值,COALESCE 以提供默认值等,但我无法以某种方式使用它们来满足我的需求。
感谢任何帮助!而且我保证我很快就会开始阅读那本 PostgreSQL 巨著;)
【问题讨论】:
标签: sql postgresql join group-by