2012-02-09 64 views
0

假設你有一個像下面這樣的投影:拉首先從SQL組匹配的行

Artist   Painting   Year 
--------------------------------------- 
Alfred   Birds    1945 
Alfred   Apples&Oranges  1947 
Ben   ZealousNeighbours 1912 
Calum   Hope Spliced  1760 
Calum   Horseplay   1765 
Calum   Earth    1780 
David   Apples&Oranges  1947 

如何返回第一個下列關係:

Artist   Painting   Year 
--------------------------------------- 
Alfred   Birds    1945 
Ben   ZealousNeighbours 1912 
Calum   Hope Spliced  1760 
David   Apples&Oranges  1947 

即先畫每個畫家畫。 。

ANSI SQL只

+0

應該發生什麼,那裏有兩幅畫同年? – egrunin 2012-02-09 22:14:22

+0

這兩個,按字母順序返回,雖然沒有規定 – AlasdairC 2012-02-09 22:16:46

回答

1

嘗試ŧ他以下幾點:

SELECT 
    [Artist], 
    [Painting], 
    [Year] 
FROM 
(
    SELECT 
     [Artist], 
     [Painting], 
     [Year], 
     ROW_NUMBER() OVER(PARTITION BY [Artist] ORDER BY [Year] ASC) AS [Rank] 
    FROM 
     [Table] 
) AS a 
WHERE 
    a.[Rank] = 1 
+1

@egrunin提出了一個有效的問題。您可以在上面的'Rank'確定中添加一個次要訂單。例如:'ORDER BY [Year] ASC,[繪畫] ASC' – diaho 2012-02-09 22:16:59

+0

我會發布,逐字。 +1 – 2012-02-09 22:31:56

0

這應該在任何ANSI-89標準的SQL方言的工作,但是這將打破,如果一個藝術家在第一年做多的畫作 - 你可以通過存儲實際的日期時間值,而不僅僅是調整這個如果你需要更精細的粒度,那麼這一年。

SELECT * 
FROM Paintings 
    INNER JOIN 
    (SELECT Artist, MIN([Year]) MinYear 
    FROM Paintings 
    GROUP BY Artist) 
    Minimum ON Minimum.MinYear = Paintings.Year AND Minimum.Artist = Paintings.Artist 

如果你的SQL符合ANSI-2003標準,你可以做上面列出的diaho。

e:我不認爲有一種方法可以保證只使用ANSI-89 SQL爲每個藝術家返回一行。

+0

問題是我爲創建該關係而創建的查詢。我需要回到繪圖板上,謝謝你的回答。 – AlasdairC 2012-02-09 23:24:04