2016-05-04 8 views
2

ここに正しい組み合わせ。私は連続グループの間の "移行"を識別するための鍵を持っていません。私は以下<em></em> desired_output列のような列を取得しようとしているとDENSE_RANKとROW_NUMBERのような機能を試してみましたが、ように見えることはできません

だから、id_keyごとに新しいグループを打つたびに、関係なく、私は新しい「トランジション」

を開始したいと思います(シーケンス順)の前に、それはすでにそのグループをヒットした場合の最終的な目標は、取得することですMINとMAX desired_output あたりシーケンス私はGROUP BYをどうするつもりだったようなもの。私はLEAD/LAGの複雑なクエリ/ JOINSを使用してこれを実現することができましたが、誰もがDENSE_RANKのような機能(またはDENSE_RANKを使用する方法)を知っているかどうかを確認したいフルをペイントするdesired_outputに以下を(与えること画像)。

ありがとうございます!

id_key  sequence group  desired_output   
1   1   A   1 
1   2   A   1 
1   3   B   2 
1   4   B   2 
1   5   B   2 
1   6   B   2 
1   7   C   3 
1   8   C   3 
1   9   C   3 
1   10   B   4 
1   11   B   4 
1   12   B   4 
1   13   C   5 
1   14   C   5 
2   15   A   1 
2   16   A   1 
2   17   B   2 
2   18   B   2 
2   19   C   3 
2   20   C   3 
2   21   B   4 
2   22   C   5 
2   23   C   5 
2   24   C   5 

答えて

7

を助けるかもしれない選択クエリは、この試してみてくださいされています

SELECT id_key, sequence, [group], 
     SUM(flag) OVER (PARTITION BY id_key 
         ORDER BY sequence) + 1 AS desired_output 
FROM (
    SELECT id_key, sequence, [group], 
     IIF(LAG([group]) OVER (PARTITION BY id_key 
           ORDER BY sequence) <> [group], 1, 0) AS flag 
    FROM mytable) AS t 
ORDER BY sequence 

flagフィールドフラグ各id_keyパーティション内[group]列内のすべての変更を。外側のクエリは、各id_keyパーティション内のすべての[group]変化を考慮するように、総を実行しているを計算するflagフィールドを使用しています。

0

SQL Dense_Rank() functionこの要件を解決する正しい方法ですと思います。 欠けているものは、ウィンドウ関数で使用できるPartition By節です。ここで

--create table myrows (id_key int, [sequence] int, [group] varchar(3)) 
/* 
insert into myrows select 1 , 1 ,'A'  
insert into myrows select 1 , 2 ,'A'  
insert into myrows select 1 , 3 ,'B'  
insert into myrows select 1 , 4 ,'B'  
insert into myrows select 1 , 5 ,'B'  
insert into myrows select 1 , 6 ,'B'  
insert into myrows select 1 , 7 ,'C'  
insert into myrows select 1 , 8 ,'C'  
insert into myrows select 1 , 9 ,'C'  
insert into myrows select 1 , 10 ,'B'  
insert into myrows select 1 , 11 ,'B'  
insert into myrows select 1 , 12 ,'B'  
insert into myrows select 1 , 13 ,'C'  
insert into myrows select 1 , 14 ,'C'  
insert into myrows select 2 , 15 ,'A'  
insert into myrows select 2 , 16 ,'A'  
insert into myrows select 2 , 17 ,'B'  
insert into myrows select 2 , 18 ,'B'  
insert into myrows select 2 , 19 ,'C'  
insert into myrows select 2 , 20 ,'C'  
insert into myrows select 2 , 21 ,'B'  
insert into myrows select 2 , 22 ,'C'  
insert into myrows select 2 , 23 ,'C'  
insert into myrows select 2 , 24 ,'C'  
*/ 

select *, 
    DENSE_RANK() over (partition by id_key order by [group]) desired_output 
from myrows 
+0

は、私はOK、私が見..私はGiorgosソリューションを定義するために使用されるSQL ServerのLAG()関数で正常に動作だと思い – Tanner

+0

:-)だところである... 21 =シーケンスでグループの推移を考慮していませんシーケンス内のギャップやキャッチデータの変化 – Eralper

関連する問題