2012-05-09 64 views
2

任何人都可以幫助我知道如何建立以下表的SQL查詢以獲取與最新日期不同的行(基於名稱和日期)。Sql不同組按行

Date    Name  Score 

2011-06-16 10:30 Johan 36  
2010-12-09 08:52 Thomas 32 
2012-04-25 15:14 Jak  56 
2008-09-07 11:57 Jak  64 
2012-02-28 13:22 Jan  23 
2011-01-11 12:08 Thomas 22  
2008-10-06 12:22 Kane  54 

結果,查詢將顯示行1,3,6,7

+1

可能重複的[SQL - 從一組結果中選擇唯一行](http://stackoverflow.com/questions/1339624/sql-select-unique-rows-from-a-group-of-results) –

回答

1

您可以使用以下方法:

select date, name, score 
from temp t1 
where date = (select max(date) from temp where t1.name = temp.name) 

看到sql fiddle與演示。

+0

+1爲小提琴:) – mrd

1

假設你的關係數據庫管理系統不支持窗口功能,

SELECT a.* 
FROM table1 a 
INNER JOIN 
(
    SELECT name,MAX(date) as max_date -- date field may need escaping 
    FROM table1 a 
    GROUP BY name 
)b ON (b.name = a.name AND a.date=b.max_date) 

更新

正在關注戴姆斯評論,如果日期+名稱不是唯一的,但你只想看到一個名字,

SELECT c.name,c.date, MAX(c.score) as max_score 
FROM 
(
SELECT a.* 
FROM table1 a 
INNER JOIN 
(
    SELECT name,MAX(date) as max_date -- date field may need escaping 
    FROM table1 a 
    GROUP BY name 
)b ON (b.name = a.name AND a.date=b.max_date) 
)c 
+1

+1:但是請注意,這確實會假設*對於每個名稱,日期字段都是唯一的。 – MatBailie

+0

@Dems:我同意,但我認爲在這種情況下(名稱+日期是唯一的)是相當合理的假設 – a1ex07

1

像這樣的東西應該工作...

SELECT date, name, score 
FROM table a 
WHERE date = (
    SELECT MAX(date) 
    FROM table b 
    WHERE a.name = b.name 
) 
+1

+1:但是請注意,這確實假設*對於每個名稱,日期字段都是唯一的。 – MatBailie

-1
select convert(varchar,date,103) as name_date, name from table1 where convert(varchar, date, 103) = (select convert(varchar,max(date),103) as n_date from table1) 

這是當時間不是在MSSQL數據庫SQL格式

+0

-1:轉換爲DATETIME操縱的字符串將始終從我得到-1。抱歉。 – MatBailie

+1

可悲的是我的回答來自你的訪問 – ray

2

我對她有所考慮,因爲在最大日期重複的問題。以上所有都會返回所有重複項。提問者可能仍然只想要其中的一行。

SELECT date, name, score 
FROM (select *, 
      row_number() over (partition by name order by date desc) as seqnum 
     from table a 
    ) a 
WHERE seqnum = 1 

這枚舉了行,從最新的日期開始計數倒數。然後選擇其中一個日期。

+0

+1:假設OP的SQL方言支持row_number。 – MatBailie