我有一个包含具有“速度”属性的事件的表。
为了查看这个属性的统计分布,我想按时间间隔对结果进行分组,比如说:
[0-49.99km/h] 3 objects
[50-100km/h] 13 objects
[100-150km/h] 50 objects
etc
这可以让我看到大多数物体都在一定的间隔内。
显然,可以使用适当的Where条件进行多次查询,例如:
从GaEvent a中选择计数,其中速度> = MIN且速度< MAX
但效率极低。 是否有更好的方法对这些值进行分组?
干杯!
答案 0 :(得分:2)
单独使用SQL解决此问题的一种更有效的方法是将有问题的表连接到派生表,该派生表包含直方图中所需的最小值和最大值。
例如:
select t.min, t.max, count(*)
from (
select 0 as min, 14.9 as max
union
select 15, 29.9
union
select 30, 44.9
union ...
) t
left outer join cars c on c.speed between t.min and t.max
group by t.min, t.max
order by t.min
min | max | count
-----------------
0 | 14.9 | 1
15 | 29.9 | 1
30 | 44.9 | 2
这在很大程度上取决于您使用的是哪个数据库供应商。例如,PostgreSQL有一个window functions的概念,它可以大大简化这种类型的查询,并防止你需要自己生成“直方图表”。
虽然谈到Hibernate,Projections和support for aggregrate functions的方式似乎很少适用于这样的事情。这可能是您希望下拉到使用原始SQL进行查询和/或使用Java本身进行计算的场景。
答案 1 :(得分:0)
如果您的间隔大小相同,您可以使用以下内容:
选择50 * trunc(c.speed / 50),从Car c组中计数(*)1