sql 返回没有结果的日期

Posted

技术标签:

【中文标题】sql 返回没有结果的日期【英文标题】:sql return dates where there are no results 【发布时间】: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 方法以及如何将其加入到我的其他查询中 【参考方案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

【讨论】:

以上是关于sql 返回没有结果的日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询根据日期返回结果

日期比较返回异常结果 - SQL Oracle

标准 SQL 查询在 BigQuery 中返回正确结果,但在 Data Studio 中不返回

SQL Developer 只返回日期,而不是时间。我该如何解决?

我在 2 个搜索日期之间检索事件的查询没有返回任何结果,为啥?

最近 24 小时的日期格式和获取结果表