2010-12-17 18 views
1

一般的に言えば、一連のイベントがあります。その中から、MS SQL Server 2008 R2を使用して一意の反復不可能なシーケンスを選択したいと思います。SQLで一意のサブシーケンスを選択する方法は?

この場合、具体的には、各テストに一連の録音があり、それぞれに特定の刺激シーケンスがあります。私は1つのテストの録音の中から刺激のユニークなシーケンスを選択し、それらを別のテーブルに挿入し、元のテーブルにシーケンスグループIDを割り当てたいと思います。

DECLARE @Sequence TABLE 
([ID] INT 
,[TestID] INT 
,[StimulusID] INT 
,[RecordingID] INT 
,[PositionInRecording] INT 
,[SequenceGroupID] INT 
) 

INSERT @Sequence 
VALUES 
(1, 1, 101, 1000, 1, NULL), 
(2, 1, 102, 1000, 2, NULL), 
(3, 1, 103, 1000, 3, NULL), 
(4, 1, 103, 1001, 1, NULL), 
(5, 1, 103, 1001, 2, NULL), 
(6, 1, 101, 1001, 3, NULL), 
(7, 1, 102, 1002, 1, NULL), 
(8, 1, 103, 1002, 2, NULL), 
(9, 1, 101, 1002, 3, NULL), 
(10, 1, 102, 1003, 1, NULL), 
(11, 1, 103, 1003, 2, NULL), 
(12, 1, 101, 1003, 3, NULL), 
(13, 2, 106, 1004, 1, NULL), 
(14, 2, 107, 1004, 2, NULL), 
(15, 2, 107, 1005, 1, NULL), 
(16, 2, 106, 1005, 2, NULL) 

正しくユニークな配列を同定した後、結果がこれはMySQLとGROUP_CONCATの機能のいくつかのバージョンをサポートする他のデータベースに行うことは非常に簡単です。この

DECLARE @SequenceGroup TABLE 
([ID] INT 
,[TestID] INT 
,[SequenceGroupName] NVARCHAR(50) 
) 

INSERT @SequenceGroup VALUES 
(1, 1, '101-102-103'), 
(2, 1, '103-103-101'), 
(3, 1, '102-103-101'), 
(4, 2, '106-107'), 
(5, 2, '107-106') 


DECLARE @OutcomeSequence TABLE 
([ID] INT 
,[TestID] INT 
,[StimulusID] INT 
,[RecordingID] INT 
,[PositionInRecording] INT 
,[SequenceGroupID] INT 
) 

INSERT @OutcomeSequence 
VALUES 
(1, 1, 101, 1000, 1, 1), 
(2, 1, 102, 1000, 2, 1), 
(3, 1, 103, 1000, 3, 1), 
(4, 1, 103, 1001, 1, 2), 
(5, 1, 103, 1001, 2, 2), 
(6, 1, 101, 1001, 3, 2), 
(7, 1, 102, 1002, 1, 3), 
(8, 1, 103, 1002, 2, 3), 
(9, 1, 101, 1002, 3, 3), 
(10, 1, 102, 1003, 1, 3), 
(11, 1, 103, 1003, 2, 3), 
(12, 1, 101, 1003, 3, 3), 
(13, 2, 106, 1004, 1, 4), 
(14, 2, 107, 1004, 2, 4), 
(15, 2, 107, 1005, 1, 5), 
(16, 2, 106, 1005, 2, 5) 

答えて

1

のようになります。 SQL Serverでは、明らかに難しいことです。 1つの手法について説明しているstackoverflow questionがあります。ここにはanotherと、SQL Server 2008の特定のソリューションに関する情報があります。

0

これはこれを行います。 @SequenceGroupに列を追加しなければならなかった。

DECLARE @Sequence TABLE 
([ID] INT 
,[TestID] INT 
,[StimulusID] INT 
,[RecordingID] INT 
,[PositionInRecording] INT 
,[SequenceGroupID] INT 
) 

INSERT @Sequence 
VALUES 
(1, 1, 101, 1000, 1, NULL), 
(2, 1, 102, 1000, 2, NULL), 
(3, 1, 103, 1000, 3, NULL), 
(4, 1, 103, 1001, 1, NULL), 
(5, 1, 103, 1001, 2, NULL), 
(6, 1, 101, 1001, 3, NULL), 
(7, 1, 102, 1002, 1, NULL), 
(8, 1, 103, 1002, 2, NULL), 
(9, 1, 101, 1002, 3, NULL), 
(10, 1, 102, 1003, 1, NULL), 
(11, 1, 103, 1003, 2, NULL), 
(12, 1, 101, 1003, 3, NULL), 
(13, 2, 106, 1004, 1, NULL), 
(14, 2, 107, 1004, 2, NULL), 
(15, 2, 107, 1005, 1, NULL), 
(16, 2, 106, 1005, 2, NULL) 

DECLARE @SequenceGroup TABLE 
([ID] INT IDENTITY(1, 1) 
,[TestID] INT 
,[SequenceGroupName] NVARCHAR(50) 
,[RecordingID] INT 
) 

insert into @SequenceGroup 
select TestID, (stuff((select '-' + cast([StimulusID] as nvarchar(100)) 
from @Sequence t1 
where t2.RecordingID = t1.RecordingID 
for xml path('')), 1, 1, '')), RecordingID 
from @Sequence t2 
group by RecordingID, TestID 
order by RecordingID 

select * from @SequenceGroup 

update @Sequence 
set SequenceGroupID = sg.ID 
from @Sequence s 
join @SequenceGroup sg on s.RecordingID=sg.RecordingID and s.TestID=sg.testid 

select * from @Sequence 
関連する問題