postgresql按工作日选择,包括rails中的空记录

Posted

技术标签:

【中文标题】postgresql按工作日选择,包括rails中的空记录【英文标题】:postgres sql selecting by weekday including empty records in rails 【发布时间】:2013-12-24 12:32:01 【问题描述】:

我有一个 90% 的查询,我正在查询关于一周中每一天发生的事情的数据,这对那里的数据很好,但我也想要那些不存在的数据(我希望查询包含一周中不存在的几天的零)。

SELECT EXTRACT(dow FROM start_at) AS number, COUNT(*) FROM "events" GROUP BY number

或用于导轨...

Event.select("EXTRACT(dow FROM start_at) AS number, COUNT(*)").group("number")

结果。

+----+--------+-------+
| id | number | count |
+----+--------+-------+
|    | 0.0    | 16    | # day of the week Sunday
|    | 1.0    | 20    |
|    | 2.0    | 29    |
|    | 3.0    | 19    |
|    | 4.0    | 4     |
+----+--------+-------+

如何扩展此查询以映射一周中的所有日子,即使没有记录? (看起来像这样)。

+----+--------+-------+
| id | number | count |
+----+--------+-------+
|    | 0.0    | 16    |
|    | 1.0    | 20    |
|    | 2.0    | 29    |
|    | 3.0    | 19    |
|    | 4.0    | 4     |
|    | 5.0    | 0     | # i want these zeros too!
|    | 6.0    | 0     |
+----+--------+-------+

【问题讨论】:

【参考方案1】:

试试这个:

events = Event.select("EXTRACT(dow FROM start_at) AS number, COUNT(*)").group("number")

counts = events.each_with_object() do |event, counts|
  counts[event.number.to_i] = event.count
end

weekdays = (0..6).map do |day|
  
    number: day,
    count: counts[day] || 0
  
end

它应该为您提供每天的哈希数组以及当天的计数,即使计数为零。我无法完全测试它,因为我没有您的数据库表,但希望它能为您指明正确的方向。

【讨论】:

以上是关于postgresql按工作日选择,包括rails中的空记录的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 和 PostgreSQL 中完全忽略时区

RedShift / PostgreSQL 中串行类型的替代方案

使用 Rails + Postgresql + Heroku 构建数据库

Rails 6 Docker 与 PostgreSQL 连接错误

PostgreSQL 按日期过滤条目,但包括未包含日期为空的条目

Rails 查询包括不工作