2012-05-09 13 views
2

誰でも、次の表のために名前と日付に基づいて別の行を最新の日付で取得するためのSQLクエリを構築する方法を知ってもらえますか?あなたのRDMSは、ウィンドウ関数をサポートしていないと仮定すると、結果として行別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 for fiddle :) – 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) 

時間が

+0

-1:DATETIME操作の文字列への変換は、常に私から-1を得るでしょう。ごめんなさい。 – MatBailie

+1

私の答えがur perviewに来た悲しい – ray

2

MSSQLデータベースSQL形式で考慮されていないときに、これは私があるため、最大日付の重複の問題により、何かを貢献しています。上記のすべてがすべての重複を返します。質問者は依然として行の1つだけを必要とする可能性があります。

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 

これは、最新の日付から順にカウントして行を列挙します。次に、日付の1つを選択します。

+0

+1:OPs SQLの方言がrow_numberをサポートしていると仮定します。 – MatBailie