2011-11-13 46 views
1

我有一个电影数据库,其中一个字段是它发布的年份。如何遍历指定的范围

我想创建一个查询,它将循环遍历每个十年,并将计算该十年特定字段的总和。我不知道怎样才能每十年获得一个循环。谁能帮忙?

+0

我在postgresql中做过类似的查询。要检查我是否保存了它。 – heldt

回答

1

如果你想,你没有任何电影,以及那些电影,那么你的十年可以使用generate_series来建立几十年的列表,并对表格执行左外连接; generate_series是在PostgreSQL中实时创建数字和时间列表的标准方法。像这样的东西应该让你开始:

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 

这将产生输出这样的:

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

如果需要,你可以调整为generate_series调用的第一个和最后一个值来匹配您的数据。

floor(t.year/10) * 10 bit给你给定年的十年;它会将1942年转换为1940年,2000年至2000年等。

如果您将数据库迁移到没有类似generate_series的数据库,则可以设置一个十年表(每个十年一个条目) 。 SQL将几乎相同,只需使用十进制表替换generate_series调用即可。

+0

谢谢,我想我现在有一个想法该怎么做。 – steve

+0

虽然在这种情况下这可能不相关,但值得注意的是'generate_series'也可以用于日期范围。 – 2013-08-14 09:39:55

+0

@PeterM:在日期中使用'generate_series'时需要注意,'generate_series'的形式实际上与'timestampz'一起使用,如果您不小心,会导致奇怪的时区问题:http:// stackoverflow。 com/a/12994322/479863 –

0

尝试是这样的(不知道你的表怎么看,猜测):

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;