【问题标题】:sql return dates where there are no resultssql 返回没有结果的日期
【发布时间】:2013-02-19 02:56:29
【问题描述】:

我想得到一个结果表,显示 X 有条目的日期

SELECT count(*),
       date_column
FROM myTable
WHERE X
GROUP BY date_column
ORDER BY date_column DESC

这可行,但我还想查看 X 没有条目的日期,在我的用例中,这将是中间日期。

因此,例如 2013-3-10 将出现在结果中,但下一个日期将是 2013-3-5,但我需要我的结果还返回 count = 0 的天数,所以在这种情况下, 6、7、8、9号

我将如何格式化我的查询以包含这些额外的时间?

【问题讨论】:

  • 什么数据库?您必须使用生成的日期表离开联接。例如 PG 为此具有 generate_series 但其他数据库可能需要其他黑客攻击。
  • SQL 不创建数据。因此,您要么必须拥有所有可能日期的来源并将它们加入其中,要么您只需要在显示结果时构建它,以便 NULL 日期计数为 0。这种技术可以追溯到存储昂贵的日子,因此您没有存储 0 数据。缺少数据就足够了,如果需要,您可以让显示工具显示 0。
  • @xQbert 对,我正在使用可以将数据作为数组检索的 ORM,我可以在那里对其进行操作。想知道是否有办法在查询中做到这一点
  • @JakubKania 我正在使用 postgres,您能否详细说明 generate_series 方法以及如何将其加入到我的其他查询中

标签: sql postgresql timestamp epoch


【解决方案1】:

我模拟了一个简单的例子:

SELECT q.date_column, count(f.id) FROM
(SELECT
 generate_series(min(date_column),max(date_column), '1 day') AS date_column
 FROM mytable) AS q
LEFT JOIN mytable AS f
ON q.date_column=f.date_column
GROUP BY q.date_column ORDER BY q.date_column;

这会生成所需范围内的所有日期。确保不要做 count(*) 否则你会得到 1 而不是 0 http://sqlfiddle.com/#!1/fd4ff/1

【讨论】:

  • @xQbert 这当然很好,因为您不必担心您的供体表是否足够大。但是对于 MSSQL 和 Oracle(以及 PostgreSQL)的窗口函数和 MySQL 的变量也可以做到这一点。您只需从表中选择 row_number (或与自身交叉连接的表足够多次以提供您想要的数字)并添加到日期。
  • hmmmm,f.id 在每个日期总是返回 0
  • @CQM 你能在 sqlfiddle 上显示它吗?我提供的示例有效。
【解决方案2】:

以下适用于 postgresql:

SELECT count(*) as count, datecolumn as date FROM myTable group by datecolumn UNION 
select 0 as count, i::date as date from generate_series('2013-01-01', 
'2013-12-31', '1 day'::interval) i where i not in (select datecolumn from myTable) order by date desc

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多