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 查询在 BigQuery 中返回正确结果,但在 Data Studio 中不返回
SQL Developer 只返回日期,而不是时间。我该如何解决?