Как сгруппировать результаты по интервалам? - PullRequest
2 голосов
/ 03 августа 2010

У меня есть таблица, содержащая события со свойством speed.

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

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

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

Очевидно, что это можно сделать с помощью нескольких запросов с соответствующими условиями Где, например:

selectотсчитайте от GaEvent a, где скорость> = MIN и скорость

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

Cheers!

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Более эффективный способ решить эту проблему только в 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 есть концепция оконных функций , которая может существенно упростить этот тип запроса и лишить вас необходимости самостоятельно создавать «таблицу гистограмм».

Когда дело доходит до HibernateПохоже, что Projection и поддержки агрегированных функций , которые применимы к чему-либо подобному, очень мало.Это вполне может быть сценарий, в котором вы хотите перейти к использованию необработанного SQL для запроса и / или выполнить вычисления в самой Java.

0 голосов
/ 05 августа 2010

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

выберите 50 * усечение (c.speed / 50), количество (*) из группы Car c на 1

...