2011-11-13 3 views
1

J'ai une base de données de films où un champ est l'année où il a été publié.comment boucler dans une plage spécifiée

Je veux créer une requête qui parcourra chaque décennie et calculera la somme d'un champ particulier pour cette décennie. Je ne sais pas comment je peux obtenir une boucle pour chaque décennie. Quelqu'un peut-il aider?

+0

J'ai fait une requête similaire dans postgresql. Je vais vérifier si je l'ai sauvé. – heldt

Répondre

1

Si vous voulez que les décennies où vous n'avez pas des films aussi bien que ceux avec des films, alors vous peut utiliser generate_series pour construire votre liste de décennies et faire une jointure externe gauche à votre table; generate_series est la manière standard de créer des listes numériques et temporelles à la volée dans PostgreSQL. Quelque chose comme cela devrait vous aider à démarrer:

select decade.d, count(t.year) 
from generate_series(1900, 2100, 10) as decade(d) 
left outer join your_table t on decade.d = floor(t.year/10) * 10 
group by decade.d 
order by decade.d 

qui produira une sortie comme ceci:

d | count 
------+------- 
1900 |  1 
1910 |  0 
1920 |  1 
1930 |  3 
1940 |  0 
1950 |  0 
1960 |  1 
1970 |  0 
1980 |  3 
-- ... 
2100 |  0 

Vous pouvez régler les première et dernière pour l'appel generate_series pour correspondre à vos données si on le souhaite.

Le bit vous donne une décade pour une année donnée; il va convertir 1942 à 1940, 2000 à 2000, etc.

Vous pouvez mettre en place une table de la décennie (un tableau à une colonne avec une entrée pour chaque décennie) si vous vous déplacez vers une base de données qui n'a pas quelque chose comme generate_series . Le SQL serait à peu près le même, il suffit de remplacer l'appel generate_series avec votre table de la décennie.

+0

merci, je pense que j'ai une idée de ce qu'il faut faire maintenant. – steve

+0

Bien que cela puisse ne pas être pertinent dans ce cas, il vaut la peine de noter que 'generate_series' peut également être utilisé avec des plages de dates. –

+0

@PeterM: Un certain soin est nécessaire lors de l'utilisation de 'generate_series' avec des dates, cette forme de' generate_series' fonctionne réellement avec 'timestampz's et cela peut causer des problèmes de fuseaux horaires si vous ne faites pas attention: http: // stackoverflow. com/a/12994322/479863 –

0

Essayez quelque chose comme ça (ne savent pas comment vos tables regardent, devinettes):

SELECT movie_year, sum(column_x) 
FROM (
    SELECT year 
     , date_trunc('decade', movie_year)::date as decade 
     , column_x 
    FROM movies) as movies_with_decades 
GROUP BY decade 
ORDER BY decade; 
Questions connexes