我需要创建一个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','YYYY-MM-DD') AS date FROM generate_series(0,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语句在另一个值子集如果null,COALESCE提供默认值等,但我还没能使用它们的方式,让我得到我所需要的。
任何援助赞赏!我承诺我很快就会读到这本庞大的Postgresql书籍;)
你只需要一个左外连接而不是内连接:
原文链接:https://www.f2er.com/postgresql/193510.htmlSELECT d.date,count(se.id) FROM (SELECT to_char(date_trunc('day','YYYY-MM-DD') AS date FROM generate_series(0,1) AS offs ) d LEFT OUTER JOIN sharer_emailshare se ON d.date = to_char(date_trunc('day','YYYY-MM-DD')) GROUP BY d.date;