2017-01-25 2 views
1

私は4列のテーブルを持っています。 番号、コード、シリアル番号の組み合わせで最高のバージョンを取得したい 複数のバージョンが残っている場合は、別の結果セットが必要です。Max SQL以外のバージョンを取る

Number Version Code Serial No 
12345 1  VB  88 
12345 2  VB  88 
23456 1  VB  44 
33334 1  VB  55 
33334 2  VB  55 
33334 3  VB  55 

1つのテーブルでは、私は別の結果は、とにかく、私は最初のセットを取得することができ

Number Version Code Serial No 
12345 1  VB  88 
33334 1  VB  55 
33334 2  VB  55 

を設定

Number Version Code Serial No 
12345 2  VB  88 
23456 1  VB  44 
33334 3  VB  55 

各番号、コード、シリアル番号マイ結果1のみ最高の問題を必要としますクエリを使用します。 2番目のセットを取得する方法。一時テーブルを使用しないでください。

+0

[ 'EXCEPT'](https://でMSDN。microsoft.com/en-us/library/ms188055.aspx)、またはロジックに応じて別の方法を使用すると、フィルタの一部を反転させることができます。 – Pred

+0

2番目の結果を作成するロジックは何ですか? –

答えて

2

2番目の結果セットを取得するには、次のようにします。あなたはwhere条件を変更し、結果の両方を取得するためにrow_number機能を使用することができ、クエリ

select * from 
(select t.*, 
    row_number() over (partition by number,code,SerialNo order by version desc) as rnk 
from table t) 
where rnk <> 1 
2

を実行するために取得できませんでした。

select number,version,code,serialno 
from (select t.* 
     ,row_number() over(partition by number,code,serialno order by version desc) as rnum 
     from tablename t 
    ) x 
where rnum > 1 --rnum=1 for the first result 
+0

私たちが 'version desc'で注文したら、最高のバージョンはランク1になります。 – Utsav

+0

yes ..これはopが2番目の結果に必要なものです。最高のバージョンを除くすべての行。 –

+0

オクラホマそうだけど。 – Utsav

2

common table expressionrow_number()で:


変更 cte.rn!=1から cte.rn=1は、2番目の結果が

with cte as (
    select 
     t.* 
    , rn = row_number() over (
      partition by t.[Number], t.[Code], t.[Serial No] 
      order by t.[Version] desc 
      ) 
    from tbl t 
) 
select cte.* 
    from cte 
    where cte.rn = 1 


top with tiesを設定し取得します
select top 1 with ties 
    t.* 
    from tbl t 
    order by row_number() over (
    partition by t.[Number], t.[Code], t.[Serial No] 
    order by t.[Version] desc) 

2番目の結果セット:

select t.* 
from tbl t 

except 

select top 1 with ties 
    t.* 
    from tbl t 
    order by row_number() over (
    partition by t.[Number], t.[Code], t.[Serial No] 
    order by t.[Version] desc) 
インナー

max(version)に参加:
変更m.[Version] = t.[Version]m.[Version] != t.[Version]には、2番目の結果セットを取得する


over()バージョンと:2番目の結果を得るためにm.[Version] != t.[Version]
変更m.[Version] = t.[Version]は、すでにMAX(VERSION)を取得するクエリを持っている場合、サブクエリとしてそれを使用することが論理的である

with cte as (
    select 
     t.* 
    , MaxVersion = max([Version]) over (
      partition by t.[Number], t.[Code], t.[Serial No] 
      ) 
    from tbl t 
) 
select cte.[Number], cte.[Code], cte.[Serial No], cte.[Version] 
    from cte 
    where cte.MaxVersion = cte.[Version] 
0

を設定しました。

MAX(バージョン):

SELECT NUMBER,CODE,SERIAL,MAX(VERSION) 
    FROM Q 
    GROUP BY NUMBER,CODE,SERIAL 

残り:

SELECT NUMBER,CODE,SERIAL,VERSION 
    FROM Q 
    WHERE (NUMBER,CODE,SERIAL,VERSION) NOT IN (
     SELECT NUMBER,CODE,SERIAL,MAX(VERSION) 
      FROM Q 
      GROUP BY NUMBER,CODE,SERIAL 
    ) 
+2

これはSql-Serverでは動作しません。 – ATC