如何按间隔对结果进行分组?

时间:2010-08-03 16:16:39

标签: java sql hibernate group-by

我有一个包含具有“速度”属性的事件的表。

为了查看这个属性的统计分布,我想按时间间隔对结果进行分组,比如说:

[0-49.99km/h] 3 objects
[50-100km/h] 13 objects
[100-150km/h] 50 objects
etc

这可以让我看到大多数物体都在一定的间隔内。

显然,可以使用适当的Where条件进行多次查询,例如:

从GaEvent a中选择计数,其中速度> = MIN且速度< MAX

但效率极低。 是否有更好的方法对这些值进行分组?

干杯!

2 个答案:

答案 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,Projectionssupport for aggregrate functions的方式似乎很少适用于这样的事情。这可能是您希望下拉到使用原始SQL进行查询和/或使用Java本身进行计算的场景。

答案 1 :(得分:0)

如果您的间隔大小相同,您可以使用以下内容:

选择50 * trunc(c.speed / 50),从Car c组中计数(*)1