使用Postgres JSON列计算Rails的规范化平均值

时间:2015-09-01 14:08:49

标签: sql ruby-on-rails json postgresql

我在Postgres DB中有一个大型统计表,其架构如下所示:

<location path="Account">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

我使用this blog post构建了以下查询来查找stats json对象中给定属性的平均值(例如使用&#39; hits&#39; stat):

player_id: integer,
region: string,
position: string,
league: string,
stats: json

效果很好而且速度很快。然而,一些统计数据需要根据玩家在游戏中的时间来构建。给定具有以下格式的stats对象:

attributes = {region: 'x', position: 'y', league: 'z'}
Stat.where(attributes).average("cast(payload ->> 'hits' as integer)").to_f

我希望获得每分钟5次杀戮({ "kills":10 "time_played":120 # seconds } )的值,假设这是唯一找到的统计数据(这将是更多,这就是为什么我要做{{{{ 1}},但为了一个简单的例子......)

我在这里陷入困境。我知道sql在分割内容方面没有问题,但是扔掉JSON让我很困惑。我试过这个:

10 / (120/60)

它返回average - 而且我不确定如何调试此语句。有任何想法吗?

解决方案

这是在EgonWilzer的帮助下最终工作的结果:

Stat.where(attributes).average("cast(payload ->> 'kills' as integer) / (cast(payload ->> 'time_played' as integer) / 60)").to_f

1 个答案:

答案 0 :(得分:1)

问题是除数整数/整数,如果第二个更大,它将始终返回0。

您可能会使用as real而不是as integer获得预期结果。