2012-07-18 109 views
1

我在嘗試構建一個查詢,它將按NameYear排序,篩選出年份較高的重複項並將這些記錄返回到表中。我的數據目前看起來是這樣的:返回非重複記錄的SQL

ID-----Name-----Year 
1  Bob  2010 
2  John  2014 
3  Bob  2004 
4  Eric  2005 

的數據應該由Name然後其次由Year降序方式分類可主要排序,像這樣:

ID-----Name-----Year 
3  Bob  2004 
1  Bob  2010 
4  Eric  2005 
2  John  2014 

然後複製Name記錄應是過濾返回只有最低Year像這樣:

ID-----Name-----Year 
3  Bob  2004 
4  Eric  2005 
2  John  2014 

我試過像SELECT DISTINCTHAVING COUNT但我似乎無法得到它。可能缺少一些簡單的東西。任何幫助?

+0

您使用的是哪個數據庫? – RedFilter 2012-07-18 19:32:36

+0

您的第一個數據示例與您的第二個數據不符。 – RedFilter 2012-07-18 19:40:01

+0

謝謝,我修好了。 – aus 2012-07-18 20:08:37

回答

5
select ID, Name, Year 
from (
    select ID, Name, Year, Rank() over (partition by Name order by year) as Rank 
    from MyTable 
) t 
where Rank = 1 

SQL FIddle Example #1

如果您不能使用PARTITION,你可以這樣做:

select m.ID, m.Name, m.Year 
from (
    select Name, min(Year) as MinYear 
    from MyTable 
    group by Name 
) mm 
inner join MyTable m on mm.Name = m.Name and mm.MinYear = m.Year 

SQL Fiddle Example #2

+0

謝謝。這是我需要的! – aus 2012-07-18 19:50:04

1
SELECT Name, MIN(Year) FROM table 
GROUP BY Name 
ORDER BY Name ASC 
+0

可能想要將年份更改爲ASC – lusketeer 2012-07-18 19:32:58

+0

@ user1301840你是對的,正在閱讀問題(「年份」以下降的方式)而不是看結果。 – Kermit 2012-07-18 19:34:23

+0

你能解決這個問題嗎?從選擇中刪除「ID」。從訂單中刪除「年」。您的解決方案背後的想法很好,但查詢不是。 – 2012-07-18 19:34:54

0

假設MySQL的

select min(id), name, min(year) 
from (
select distinct t1.id, t1.name, t2.year 
from tbl t1, tbl t2 
odrer by t1.name, t2.year 
) T 
group by name