我需要创建一个返回的 PostgreSQL 查询
- 一天
- 当天找到的对象数量
重要的是每一天都出现在结果中,即使那天没有发现任何对象。(这之前已经讨论过,但我无法在我的具体情况下让事情正常进行。)
首先,我找到了一个sql 查询来生成一系列 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”的表中,该表有一个“created”列:
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
,这是预期的行为,如postgres docs 中所述。
我查看了数十个 StackOverflow 解决方案,所有具有工作查询的解决方案似乎都特定于 MySQL/Oracle/MSSQL,我很难将它们转换为 PostgreSQL。
问这个问题的人用 Postgres 找到了他的答案,但把它放在了一段时间前过期的 pastebin 链接上。
我试图切换到LEFT OUTER JOIN
, RIGHT JOIN
, RIGHT OUTER JOIN
, CROSS JOIN
, 如果为 null ,则使用CASE
语句来插入另一个值,COALESCE
以提供默认值等,但我无法以某种方式使用它们来获得我需要的东西。
任何帮助表示赞赏!我保证我很快就会开始阅读那本 PostgreSQL 巨著;)