2010-08-03 72 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