我需要创建一个返回

  • 一天
  • 当天找到的物品数量

重要的是,即使那天没有发现任何东西,也要有every single day appear in the results件.(之前已经讨论过这一点,但在我的具体 case 中,我还没能让事情顺利进行.)

首先,我找到了一个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"的表中,该表有一个"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,这是预期的行为,如discussed in the postgres docs.

我浏览了几十种StackOverflow解决方案,所有具有有效查询的解决方案似乎都是针对MySQL/Oracle/MSSQL的,我很难将它们转换为PostgreSQL.

this question的人找到了自己的答案,用Postgres,但把它放在一个pastebin链接上,该链接在一段时间前就过期了.

我试着切换到LEFT OUTER JOINRIGHT JOINRIGHT OUTER JOINCROSS JOIN,如果为空,用CASE语句替换另一个值,用COALESCE语句提供一个默认值,等等,但我一直无法以我需要的方式使用它们.

感谢您的帮助!我保证我很快就会go 读那本巨大的PostgreSQL书籍;)

推荐答案

你只需要一个left outer join而不是一个内部连接:

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 LEFT OUTER JOIN
     sharer_emailshare se 
     ON d.date = to_char(date_trunc('day', se.created), 'YYYY-MM-DD'))  
GROUP BY d.date;

Sql相关问答推荐

PostgreSQL:获取每家店铺收入最高的员工

值对于类型字符来说太长

我怎样才能得到列值对应的最大值在另一个?

将所有XML文件导入到SQL Server中

如何从查询中的三个或更多个表中添加另一个相同的列?

将FLOAT转换为VARBINARY,然后再转换回FLOAT

Oracle 23c ROUND,数据类型为DATE

SQL Athena/prest判断值是否在嵌套的json数组中

为什么SQL in中的空子查询有时被视为null

聚合内部的条件在哪里?

YEAR 函数仍然不可SARGable 吗?

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

SQL根据另一列的顺序和值获取组中的最后一列

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

如何解释 SQL Server 中的 Foxpro 语法?

两个具有 NULL 值的表达式结果之间的差异

使用ALTER TABLE无法删除列

SQL 计数和过滤查询优化

连续日期的SQL

postgreSQL 中的循环表