2016-06-27 10 views
0

このような表を検討してください。 私は今、私は最大 'ID' を持つ行は ''スマートGROUP BY

Id A B C D 
3 1 3 2 75 
4 2 2 2 45 
5 3 2 5 26 

によってグループ化したい

Id A B C D 
1 1 1 8 25 
2 1 2 5 35 
3 1 3 2 75 
4 2 2 2 45 
5 3 2 5 26 

をテストし、それを呼び出します -

--Work, but I do not want 
SELECT MAX(Id), A   FROM Test GROUP BY A 
--I want but do not work   
SELECT MAX(Id), A, B, C, D FROM Test GROUP BY A 
--Work but I do not want   
SELECT MAX(Id), A, B, C, D FROM Test GROUP BY A, B, C, D 
--Work and I want 
SELECT old.Id, old.A, new.B, new.C, new.D 
FROM(
    SELECT 
     MAX(Id) AS Id, A 
    FROM 
     Test GROUP BY A 
    )old 
JOIN Test new 
ON old.Id = new.Id 

すると、最後に書くための良い方法はあります結合なしのクエリ

+2

タグdbmsが使用されている質問 –

答えて

3

ほとんどのデータベースのサポートwindow functions

select * 
from (
    select *, row_number() over (partition by a order by id desc) rn 
    from test 
) t 
where rn = 1 
1

ほとんどのDBMSは、Common Table Expressions(CTE)をサポートするようになりました。あなたは1つを使うことができます。

;with maxa as (
select row_number() over(partition by a order by id desc) rn, 
id,a,b,c,d from test 
) 
select id,a,b,c,d 
from maxa 
where rn=1 
+1

なぜダイレクトクエリではなくCTEですか? – Andrew

+0

OPはすべての列が変更されていない状態で 'max(id)'が必要です。グループbyを使って関数を集計しても、必要なものは返されません。 –

+0

どのように列を変更しますか? – topolm