2017-05-27 14 views
1

これはSQL ServerのGroup byを使用して実行できるかどうかという非常に基本的な質問です。SQLグループの基本的な使い方

私はこのようなテーブルを持っている:

ID Version 
------------- 
123 1 
123 3 
158 1 
158 2 
158 4 

Group By ID, max(Version)を使用して、私は私が興味深いデータである別の列value、と拡張テーブル持って

ID Version 
-------------- 
123 3 
158 4 

を得る:

ID Version Value 
---------------------- 
123 1   abc 
123 3   xyz 
158 1   pq 
158 2   je 
158 4   kju 

検索したい

ID Version Value 
---------------------- 
123 3   xyz 
158 4   kju 

上記の値を取得できません。これはGroup Byを使用して可能ですか?

答えて

2

INNER JOINをSUBQUERYで解決できます。あなたのテーブル名はわかりませんが、それらをVersionTableとVersionValueTableと呼ぶことができます。だから私はこれを行うでしょう:

SELECT vt.ID, vt.Version, vvt.Value 
FROM VersionValueTable vvt 
    INNER JOIN (SELECT ID, MAX(Version) 
       FROM VERSION 
       GROUP BY ID) vt ON vt.ID = vvt.ID AND vt.Version = vvt.Version 
1

これのためにgroup byを使用しません。最も一般的なアプローチはrow_number()です:

select t.* 
from (select t.*, 
      row_number() over (partition by id order by version desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

これを行うには無数他の方法があります。あなたはウィンドウ関数について学習している場合は、group byに最も近いです:

select t.* 
from (select t.*, 
      max(verson) over (partition by id) as max_version 
     from t 
    ) t 
where version = max_version; 
0

あなたは、各行のIDに属しているマックス・バージョンと行のバージョンを比較することができます。 サブクエリを使用すると、同じIDを持つ行のサブセットを検索し、[バージョン]フィールドの最大値を取得できます。次のコードで見たよう:

SELECT * FROM MyTable t1 
    WHERE t1.version = 
     (SELECT max(version) FROM MyTable t2 WHERE t2.id = t1.id) 

メイン選択クエリの現在の行と同じIDを持つレコードのサブセットを、見つけるには、whereclause(WHERE t2.id = t1.idを使用することができます)ここで、t1はメインクエリのテーブルのエイリアス、t2はサブクエリのテーブルのエイリアスです。

+0

このコードは質問に答えるかもしれませんが、どのようにして問題が解決されるのかについての追加の文脈を提供すると、回答の長期的価値が向上します。 – Badacadabra

関連する問題