2010-08-03 7 views
2

У меня есть таблица, содержащая события со свойством «скорость».Как сгруппировать результаты по интервалам?

Чтобы увидеть статистическое распределение этого имущества, я хотел бы, чтобы сгруппировать результаты по интервалам, скажем:

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

Это позволит мне видеть, что большинство объектов находятся в определенном интервале.

Очевидно, что может быть сделано с несколькими запросами с подходящей Если условия, такие как:

выберите кол из GaEvent а где скорость> = MIN и MAX скорость <

, но это крайне неэффективно. Есть ли лучший способ группировки этих значений?

Cheers!

ответ

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.

+0

Спасибо! Я использую Hibernate на Grails на PostGreSQL. На данный момент я решил проблему с несколькими запросами, но это очень медленно. Знаете ли вы, можно ли это сделать в HQL? Я бы не хотел потерять независимость БД. Cheers – Mulone

+0

Я очень сомневаюсь в этом, так как цель HQL не совсем соответствует типу запроса, который вы хотите запустить. На самом деле я не думаю, что HQL может обрабатывать запросы против таблиц с не-сущностью/без отображения. Кроме того, HQL структурирован так, чтобы возвращать в качестве экземпляров результатов ваших entites, а не результаты произвольных запросов (где вы хотели бы вернуть min/max/count каждой строки в гистограмме и т. Д.), –

0

если ваши интервалы все же размера, вы можете использовать что-то вроде этого:

выбрать 50 * TRUNC (c.speed/50), граф (*) от автомобиля C Группа 1

Смежные вопросы