【问题标题】:An Advanced Query Date Grouping Dilemna高级查询日期分组难题
【发布时间】:2012-12-18 13:29:29
【问题描述】:

在我的 Rails 应用程序的 PostgreSQL 数据库中,有包含过去 10 年每小时价格的记录:

其中 10(24 x 365) 个:“12/31/2012 01:00:00”、“11.99”

以下查询按天对价格进行分组,对这些每日分组中的价格进行平均以创建每日平均价格,并返回每一天的“天”、“每日平均”对:

   HourlyPrice.average(:price, :group => "DATE_TRUNC('day', date)")

问题是,我的源数据中的每小时价格实际上反映了前一小时的价格。因此,在我的数据源 .CSV 中,一天从 01:00:00 开始,到 24:00:00 结束。

这与 PostgreSQL 喜欢在其 DateTime 列中保存记录的方式相冲突。导入 CSV 数据后,PostgreSQL 将包含时间 24:00:00 的记录转换为第二天的 00:00:00。

这会影响我上面的平均查询的准确性。要修复查询,我仍然想按天分组,但偏移 1 小时。因此,平均范围从 01:00:00 开始,到第二天的 00:00:00 结束。

是否可以调整上述查询以反映这一点?

【问题讨论】:

  • 您不必在问题的标题中添加 PostgreSQL、Rails、ActiveRecord 等。人们可以从标签中看到问题是关于什么的。也不需要添加您的姓名和“谢谢”,即使是unwanted。这些东西已从您的其他一些问题中删除,所以我想我应该让您意识到这一点。除此之外,好问题。
  • 为什么不修复 CSV 数据以匹配数据库在导入时所期望的数据?你不想让你的数据库对你撒谎,你也不想对你的数据库撒谎。
  • 谢谢穆。您的意见总是受到赞赏。我想过这个。但是,我的数据来自信誉良好的来源(公共机构),我不想破坏它们的格式。如果我将所有日期移动一行以适应 db 行为,并且有人将价格记录的日期与来源进行交叉检查以验证准确性,那么它将被关闭,从而引发混乱和不信任。也许我应该将日期列从 DateTime 转换为字符串并重试此查询?

标签: sql ruby-on-rails ruby postgresql activerecord


【解决方案1】:

您可以在应用DATE_TRUNC 函数之前从date 中减去一小时,如下所示:

HourlyPrice.average(:price, :group => "DATE_TRUNC('day', date - INTERVAL '1 hour')")

【讨论】:

  • 你说得对,安德烈。谢谢你。该查询现在遍历数千条记录并完美地创建平均值:) 干得好。再次感谢。
猜你喜欢
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多