我在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
答案 0 :(得分:1)
问题是除数整数/整数,如果第二个更大,它将始终返回0。
您可能会使用as real
而不是as integer
获得预期结果。