微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL查询按日计数/分组,显示没有数据的天数

我需要创建一个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书籍;)

你只需要一个左外连接而不是内连接:
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 LEFT OUTER JOIN
     sharer_emailshare se 
     ON d.date = to_char(date_trunc('day','YYYY-MM-DD'))  
GROUP BY d.date;

原文地址:https://www.jb51.cc/postgresql/193510.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐