2010-08-03 10 views
2

J'ai une table contenant des événements avec une propriété "speed".Comment regrouper les résultats par intervalles?

Pour voir la distribution statistique de cette propriété, je voudrais regrouper les résultats par intervalles, disons:

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

Cela me laisse voir que la plupart des objets sont dans un certain intervalle.

Il est évident que cela pourrait être fait avec plusieurs requêtes avec le appropriée Lorsque les conditions, telles que:

select count de GaEvent une où la vitesse> = MIN et la vitesse < MAX

mais cela est extrêmement inefficace. Existe-t-il un meilleur moyen de regrouper ces valeurs?

À la votre!

Répondre

2

Un moyen plus efficace d'aborder cela dans SQL seul est de joindre la table en question à une table dérivée qui contient les valeurs minimales et maximales que vous voulez dans votre histogramme.

Par exemple:

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 

Cela dépend fortement de quel fournisseur base de données que vous utilisez bien. Par exemple, PostgreSQL a un concept de window functions qui peut grossièrement simplifier ce type de requête et vous empêcher de générer vous-même la "table d'histogrammes".

Quand il s'agit de Hibernate, il semble y avoir très peu de choses sur le Projections et support for aggregrate functions qui s'appliqueraient à n'importe quoi de pareil. Cela peut très bien être un scénario dans lequel vous souhaitez utiliser SQL brut pour la requête et/ou effectuer les calculs dans Java même.

+0

Je vous remercie! J'utilise Hibernate sur Grails sur PostGreSQL. Au moment où j'ai résolu le problème avec plusieurs requêtes, mais c'est très très lent. Savez-vous si cela peut être fait en HQL? Je ne voudrais pas perdre l'indépendance DB. Salutations – Mulone

+0

Je doute fortement, car l'objectif de HQL ne correspond pas tout à fait au type de requête que vous souhaitez exécuter. En fait, je ne pense pas que HQL peut gérer les requêtes sur des tables non-entités/non-mappées. En outre, HQL est structuré pour renvoyer comme résultats des instances de vos entités, pas les résultats de requêtes arbitraires (où vous voudriez retourner le min/max/count de chaque ligne dans l'histogramme, etc.) –

0

si vos intervalles sont de la même taille, vous pouvez utiliser quelque chose comme ceci:

sélectionner 50 * trunc (c.speed/50), count (*) du groupe Car c par 1

Questions connexes