2017-08-26 3 views
0

異なるキーごとに順次パターンを見つけて分類する手助けが必要です。異なるグループのシーケンシャルパターンを検索して分類するT-SQL

私が持っているデータから、キーとそのキーに属するパターン識別子を含む新しいテーブルを作成する必要があります。次のようにパターン下記の例から

である:

キー#1および#3は1、2及び3キー#3が値8を有する値を有する 9および10異なるパターンは、キーIEのために存在している(1、2、3)Iキー#その特定 パターン用テーブルにエントリを作成する必要が (1、2、3)

データ:

key   value 
1   1 
1   2 
1   3 
2   8 
2   9 
2   10 
3   1 
3   2 
3   3 

予想される出力:

key   pattern 
1   1 
2   2 
3   1 

フィドル: http://sqlfiddle.com/#!6/4fe39

例テーブル:

CREATE TABLE yourtable 
    ([key] int, [value] int) 
; 

INSERT INTO yourtable 
    ([key], [value]) 
VALUES 
    (1, 1), 
    (1, 2), 
    (1, 3), 
    (2, 8), 
    (2, 9), 
    (2, 10), 
    (3, 1), 
    (3, 2), 
    (3, 3) 
; 
+2

「パターン識別子」のロジックを記述してください。それは明らかではない。 –

+0

キー#1と#3の値は1,2,3です。キー#3の値は8,9と10です。別のパターンが存在する場合、IE(1、2、3)にエントリを作成する必要があります。テーブルとその特定のパターン – barracuda

答えて

1

あなたは、いくつかの方法で一緒に値を連結することができます。 SQL Serverでの伝統的な方法は、for xmlを使用しています。

select k.key, 
     stuff((select ',' + cast(t.id as varchar(255)) 
       from t 
       where k.key = t.key 
       for xml path ('') 
       order by t.id 
      ), 1, 1, '' 
      ) as ids 
from (select distinct key from t) k; 

あなたはCTE /サブクエリを使用して一意の番号にこれを変換することができます:

with cte as (
     select k.key, 
      stuff((select ',' + cast(t.id as varchar(255)) 
        from t 
        where k.key = t.key 
        for xml path ('') 
        order by t.id 
        ), 1, 1, '' 
       ) as ids 
     from (select distinct key from t) k 
    ) 
select cte.*, dense_rank() over (order by ids) as ids_id 
from cte; 
+0

あなたのCTE /サブクエリは解決策ですが、最初は自分のフィドルでは機能しませんでした。 次のバイリンダリンクには、実用的なソリューションが含まれています。 http://sqlfiddle.com/#!6/9fb6e/17 – barracuda

関連する問題