2010-08-03 74 views
2

我有一个表中包含“速度”属性的事件。如何按时间间隔对结果进行分组?

为了看到这个属性的统计分布,我想组由间隔的结果,让我们说:

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

这将让我看到,大多数对象在一定的时间间隔。

很明显,可以用适当的多个查询来完成,其中的条件,如:

从GaEvent一个SELECT COUNT在速度> = MIN和速度< MAX

但是这是非常低效的。 有没有更好的方法来分组这些值?

干杯!

回答

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,它可以大大简化这种类型的查询,并防止您自己生成“直方图表”。

当谈到休眠时,虽然Projectionssupport for aggregrate functions的方式似乎很少适用于这样的事情。这很可能是您想要下拉使用原始SQL进行查询的场景,和/或在Java本身中进行计算。

+0

从汽车C组COUNT(*)谢谢!我在PostgreSQL的Grails上使用Hibernate。 目前我解决了多个查询的问题,但速度非常慢。 你知道这是否可以在HQL中完成?我不想失去DB独立性。 干杯 – Mulone 2010-08-03 18:17:13

+0

我非常怀疑它,因为HQL的目标不太适合您想要运行的查询类型。事实上,我不认为HQL可以处理查询非实体/非映射表。此外,HQL的结构是返回结果实例的实例,而不是任意查询的结果(您希望返回直方图中每行的最小/最大/计数等) – 2010-08-03 20:50:57

0

,如果你的时间间隔都是相同的大小,你可以使用这样的事情:

选择50 * TRUNC(c.speed/50),由1