2014-03-04 84 views
1

我碰到的東西來是這樣的:我可以在一個查詢中執行多個WHERE LIMIT語句嗎?

 country | year | total 
    ---------------+------+------- 
    Romania  | 2004 | 20 
    United States | 2004 | 19 
    Japan   | 2004 |  9 
    Russia  | 2004 |  8 
    China   | 2004 |  3 
    Latvia  | 2004 |  1 
    Canada  | 2004 |  1 
    Ukraine  | 2004 |  1 
    China   | 2008 | 24 
    United States | 2008 | 20 
    Japan   | 2008 |  7 
    Romania  | 2008 |  7 
    Uzbekistan | 2008 |  1 
    Spain   | 2008 |  1 
    South Korea | 2008 |  1 
    North Korea | 2008 |  1 
    Russia  | 2012 | 12 
    China   | 2012 | 12 
    United States | 2012 | 10 
    Great Britain | 2012 |  8 
    South Korea | 2012 |  1 
    Ukraine  | 2012 |  1 

我的問題是,我試圖執行一個查詢,這將使我從每年由總列排序3行。

結果會是什麼樣子:

 country | year | total 
    ---------------+------+------- 
    Romania  | 2004 | 20 
    United States | 2004 | 19 
    Japan   | 2004 |  9 
    China   | 2008 | 24 
    United States | 2008 | 20 
    Japan   | 2008 |  7 
    Russia  | 2012 | 12 
    China   | 2012 | 12 
    United States | 2012 | 10 

我能得到,如果我執行的3次獨立的查詢,各具有3 LIMIT和使用

WHERE year = 2004, WHERE year = 2008, and WHERE year = 2012 

我想要的數據,但我不能弄清楚這是否可以使用一個查詢?有些見解將不勝感激!

回答

3

使用窗函數row_number()子查詢:

SELECT * 
FROM (
    SELECT *, row_number() OVER (PARTITION BY year ORDER BY total DESC) AS rn 
    FROM tbl 
    ) sub 
WHERE rn < 4 
+0

這是否在PostgreSQL中起作用? –

+1

@juergend:當然可以。 Postgres 8.4或更高版本([2009年7月發佈](http://www.postgresql.org/support/versioning/))。按照我的手冊鏈接... –

1

好吧,如果這是T-SQL我會使用的行數,在今年對其進行分區。

select country, year, total from (
    select *, rn = row_number() over (partition by year order by total desc) 
    from tbl 
) where rn < 4 
相關問題