SQL distribution de fréquence requête pour compter les plages de groupe et comprennent le 0 compte
Donné:
table 'thing':
age
---
3.4
3.4
10.1
40
45
49
Je veux compter le nombre de choses pour chacun des 10 ans de la gamme, par exemple,
age_range | count
----------+-------
0 | 2
10| 1
20| 0
30| 0
40| 3
Cette requête vient fermer:
SELECT FLOOR(age / 10) as age_range, COUNT(*)
FROM thing
GROUP BY FLOOR(age / 10) ORDER BY FLOOR(age / 10);
De sortie:
age_range | count
-----------+-------
0 | 1
1 | 2
4 | 3
Cependant, il ne veut pas me montrer les différentes gammes qui ont 0 compte. Comment puis-je modifier la requête afin qu'elle montre également les gammes entre 0 compte?
J'ai trouvé similaires stackoverflow questions pour le comptage des plages, certains de 0 compte, mais ils impliquent d'avoir à préciser à chaque gamme (soit de coder en dur les plages dans la requête, ou en mettant les plages dans un tableau). Je préfère utiliser une requête générique comme celui ci-dessus, où je n'ai pas de spécifier explicitement chaque cas (p. ex., 0-10, 10-20, 20-30, ...). Je suis en utilisant PostgreSQL 9.1.3.
Est-il un moyen de modifier la requête simple ci-dessus pour 0 compte?
Similaires à:
Oracle: comment "groupe" sur une plage?
Obtenir la fréquence de distribution d'une virgule gamme dans MySQL
OriginalL'auteur Rob Bednark | 2012-03-13
Vous devez vous connecter pour publier un commentaire.
generate_series
à la rescousse:De déterminer la limite supérieure de
generate_series
devrait être assez simple avec une requête distincte, j'ai simplement utilisé 10 comme un espace réservé.Ce:
essentiellement génère une table en ligne appelé
s
avec une seule colonned
qui contient les valeurs de 0 à 10 (inclus).Vous pourriez envelopper les deux requêtes (une figure de la gamme, l'un pour calculer le nombre de comptes) dans une fonction si nécessaire.
Élégant réponse, @mu_is_too_short! Je l'ai essayé et cela a fonctionné. Juste ce que je cherchais. Merci!
Ouais,
generate_series
est fou-utile, il peut aussi fonctionner avec des horodatages donc bye bye les agendas.OriginalL'auteur mu is too short
Vous avez besoin d'inventer la table des tranches d'âge. Numéro de ligne fonctionne généralement bien. Faire un produit cartésien à l'encontre d'une grande table pour obtenir beaucoup de chiffres.
EDIT: mu est trop court est beaucoup plus élégant à la réponse, mais si vous ne disposez pas d'un generate_series fonction de la db, ... 🙂
OriginalL'auteur Glenn