当前位置: 首页 > 面试题库 >

获取每天创建的条目数

云浩然
2023-03-14
问题内容

假设我有一个这样的搜索查询:

SELECT COUNT(id), date(created_at)
FROM entries
WHERE date(created_at) >= date(current_date - interval '1 week')
GROUP BY date(created_at)

如您所知,例如,我得到这样的结果:

count | date
  2   |  15.01.2014
  1   |  13.01.2014
  9   |  09.01.2014

但是我 没有 得到一周中没有创建任何条目的日子。

如何获得看起来像这样的搜索结果, 包括 没有创建条目的日子?

count | date
  2   |  15.01.2014
  0   |  14.01.2014
  1   |  13.01.2014
  0   |  12.01.2014
  0   |  11.01.2014
  0   |  10.01.2014
  9   |  09.01.2014

问题答案:

SELECT day, COALESCE(ct, 0) AS ct
FROM (SELECT now()::date - d AS day FROM generate_series (0, 6) d) d – 6, not 7
LEFT JOIN (
SELECT created_at::date AS day, count(*) AS ct
FROM entries
WHERE created_at >= date_trunc(‘day’, now()) - interval ‘6d’
GROUP BY 1
) e USING (day);


  • 为您的条件使用一个可扩展的表达式WHERE,因此Postgres可以在上使用一个普通索引created_at。对于性能而言,其重要性远胜于其他所有性能。

  • 要涵盖一周(包括今天),请从“今天”开始减去6天,而不是7天。

  • 假设id已定义NOT NULLcount(*)count(id)此处相同,但速度稍快。

  • 一个CTE将是矫枉过正这里。它更慢,更冗长。

  • 先聚集,然后加入。在这种情况下,速度更快。

  • now()是标准SQL CURRENT_TIMESTAMP(也可以使用)的Postgres实现的较短和更快的实现。

这应该是最短和最快的查询。用进行测试EXPLAIN ANALYZE



 类似资料:
  • 问题内容: 通过此查询,我可以获取上周创建的所有条目: 它返回这样的结果: 现在,我还想显示上周所有已删除的条目!我可以通过实地了解他们:我尝试过的是: 但这没有用!现在,我得到两个相同的行: 我怎么了 如何显示已创建和已删除的条目? 问题答案: 由于两个时间戳在时间范围内可以存在0-n次并且彼此独立,因此您必须做更多的事情: 需要Postgres 9.3+ : CTE仅是为了方便地提供一次启动时

  • 有几种方式获取一个 Git 仓库。 一种是从网络上或者其他地方拷贝一个现有的仓库,另一种就是在一个目录中创建一个新的仓库。 git init 你只需要简单地运行 git init 就可以将一个目录转变成一个 Git 仓库,这样你就可以开始对它进行版本管理了。 我们一开始在 获取 Git 仓库 一节中介绍了如何创建一个新的仓库来开始工作。 在 远程分支 一节中我们简单的讨论了如何改变默认分支。 在

  • 你得先有一个 Git 仓库,才能用它进行操作。仓库是 Git 存放你要保存的快照的数据的地方。 拥有一个 Git 仓库的途径有两种。在已有的目录中,初始化一个新的,其一。比如一个新的项目,或者一个已存在的项目,但该项目尚未有版本控制。如果你想要复制一份别人的项目,或者与别人合作某个项目,也可以从一个公开的 Git 仓库克隆,其二。本章将对两者都做介绍。 git init 将一个目录初始化为 Git

  • 现在你已经知道了怎样用CodeIgniter从数据库中读取数据,但还不知道怎样往数据库中写入数据。在这一节中,你将学到通过怎么扩展之前写过的新闻控制器和数据模型来实现这一功能。 创建一个表单 为了向数据库里输入数据,你需要创建一个表单来输入需要被存储的信息。这就是说你需要一个带两个输入域的表单,一个用来输入标题,一个用来输入内容。另外,你可以通过数据模型中的标题来取得slug。在 applicat

  • 现在你已经知道如何通过 CodeIgniter 从数据库中读取数据了,但是你还没有 向数据库中写入数据。在这一节,你将继续完善前文中创建的 News 控制器和模型, 添加上这一功能。 创建一个表单 为了向数据库中写入数据,你需要先创建一个表单用来填写要存储的信息,这意味着 你的表单里需要包含两项:一项代表标题,另一项代表内容。你可以在模型中通过代码 从标题中提取出 slug。在文件 applica

  • 如果您有这样的字符串: < code >【hello world】这是【最好的。家]是个好地方。 如何仅提取括号[]中的每个单词(由空格分隔)。现在我有这个工作 https://regex101.com/r/Tgokeq/2 哪个返回: 你好世界 最好的。家 但我想要: 你好 世界 该 最好的 。主页 PS:我知道我可以在一个foreach中做字符串拆分,但我不想要在正则表达式本身中使用它,就像这