2011-11-13 86 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;