【问题标题】:Adding in missing dates from results in SQL从 SQL 的结果中添加缺失的日期
【发布时间】:2016-03-16 16:01:24
【问题描述】:

我有一个目前看起来像这样的数据库

Date     | valid_entry | profile
1/6/2015   1           | 1
3/6/2015   2           | 1
3/6/2015   2           | 2
5/6/2015   4           | 4

我正在尝试获取日期,但我需要查询以显示列表中不存在的日期,例如 2/6/2015。

这是我需要的样本:

Date     | valid_entry
1/6/2015   1
2/6/2015   0
3/6/2015   2
3/6/2015   2
4/6/2015   0
5/6/2015   4 

我的查询:

select date, count(valid_entry)
from database
where profile = 1
group by 1;

此查询将仅显示其中存在的日期。有没有办法在查询中使用其中不存在的日期填充结果?

【问题讨论】:

  • 您可以使用一个包含所有日期的虚拟表,然后使用 union 来获取 -not in the actual table- 日期吗?
  • 我不明白您如何计算预期输出中valid_entry 的值。第二行的4 com 来自哪里?不应该是0,因为 2015-06-02 没有行吗?
  • @a_horse_with_no_name 抱歉,应该是 0。我更新了代码如下。

标签: sql postgresql


【解决方案1】:

您可以使用generate_series() 从源表中生成介于开始日期和结束日期之间的所有日期的列表。然后可以在外连接中使用这些日期来对所有日期的值求和。

with all_dates (date) as (
  select dt::date
  from generate_series( (select min(date) from some_table), (select max(date) from some_table), interval '1' day) as x(dt)
)
select ad.date, sum(coalesce(st.valid_entry,0))
from all_dates ad
  left join some_table st on ad.date = st.date
group by ad.date, st.profile
order by ad.date;  

some_table 是您的表格,其中包含您提供的示例数据。

根据您的示例输出,您似乎还希望按date profile 分组,否则2015-06-03 不能有两行。您似乎也不想要 where profile = 1,因为这也不会生成两行 2015-06-03,如您的示例输出所示。

SQLFiddle 示例:http://sqlfiddle.com/#!15/b0b2a/2


无关,但是:希望列名只是编造的。 date 是一个列的可怕名称。一方面因为它也是一个关键字,但更重要的是它没有记录这个日期的用途。开始日期?结束日期?截止日期?修改日期?

【讨论】:

  • 非常感谢。这非常接近我所需要的。是的,列是组成的。实际的数据库比这大得多,但这是我关注的 3 列。
【解决方案2】:

为此,您必须使用日历表。在这种情况下,您可以使用所需的表创建一个内联表,然后 LEFT JOIN 将您的表添加到它:

select "date", count(valid_entry)
from (
   SELECT '2015-06-01' AS d UNION ALL '2015-06-02' UNION ALL '2015-06-03' UNION ALL
          '2015-06-04' UNION ALL '2015-06-05' UNION ALL '2015-06-06') AS t
left join database AS db on t.d = db."date" and db.profile = 1
group by t.d;

注意:谓词profile = 1 应该应用在LEFT JOIN 操作的ON 子句中。如果将其放在WHERE 子句中,则LEFT JOIN 本质上会变成INNER JOIN

【讨论】:

  • @a_horse_with_no_name 我以为是mysql问题!
  • 遗憾的是,这不是我想要的,因为这对于我需要它来说有点过于静态了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多