2011-08-04 5 views
1

J'essaye d'écrire une requête pour obtenir des comptes de valeurs dans différentes gammes. Disons que ma table a une colonne appelée «Nom» et une autre colonne appelée «Valeur» qui est numérique.Oracle Bucketing Values ​​

La colonne « Value » peut prendre des valeurs de 1 à 100.

Actuellement, je suis en train d'écrire une requête comme

select count(1) from table where value between 1 and 10 
union all 
select count(1) from table where value between 11 and 80 
union all 
select count(1) from table where value between 81 and 100. 

La requête me donne les résultats mais semble effectuer veeeeeerrrrry lent.

Y a-t-il une meilleure façon de procéder?

Veuillez noter que je ne peux pas partitionner la table en fonction des valeurs de la colonne 'Valeur', car j'ai aussi d'autres colonnes.

Modifier

Ok je vais modifier la requête ci-dessus pour

select count(distinct names) from table where value between 1 and 10 
union all 
select count(distinct names) from table where value between 11 and 80 
union all 
select count(distinct names) from table where value between 81 and 100. 

Répondre

2

Pour votre première requête, en supposant que vous ne vous inquiétez pas si vous obtenez une ligne avec trois colonnes ou trois lignes avec un colonne, vous pouvez faire quelque chose comme

SELECT SUM(CASE WHEN value BETWEEN 1 AND 10 
       THEN 1 
       ELSE 0 
      END) num_between_1_and_10, 
     SUM(CASE WHEN value BETWEEN 11 AND 80 
       THEN 1 
       ELSE 0 
      END) num_between_11_and_80, 
     SUM(CASE WHEN value BETWEEN 81 AND 100 
       THEN 1 
       ELSE 0 
      END) num_between_81_and_100 
    FROM table_name 

Cela vous permettra de numériser la table une fois plutôt que de l'analyser trois fois.

La deuxième requête, en général, renvoie un jeu de résultats différent. Vous pouvez faire correspondre votre deuxième requête avec une requête différente

SELECT COUNT(DISTINCT(CASE WHEN value BETWEEN 1 AND 10 
          THEN name 
          ELSE null 
         END)) num_distinct_between_1_and_10, 
     COUNT(DISTINCT(CASE WHEN value BETWEEN 11 AND 80 
          THEN name 
          ELSE null 
         END)) num_distinct_between_11_and_80, 
     COUNT(DISTINCT(CASE WHEN value BETWEEN 81 AND 100 
          THEN name 
          ELSE null 
         END)) num_distinct_between_81_and_100 
    FROM table_name 
+0

Bon mais pas assez bon !! –

+0

@Anand - Pouvez-vous expliquer ce qui est "pas assez bon" signifie spécifiquement? Les résultats ne sont-ils pas tout à fait ce que vous cherchez? Si oui, pouvez-vous donner des détails sur ce que la requête est ou ne retourne pas correctement? –

+0

J'ai modifié ma requête pour compter distinct –