2010-12-17 2 views
1

В общих терминах у меня есть последовательность событий, из которых я хотел бы выбрать уникальные неповторяющиеся последовательности с использованием MS SQL Server 2008 R2.Как выбрать уникальные подпоследовательности в SQL?

В данном случае каждый тест имеет серию записей, каждая из которых имеет определенную последовательность стимулов. Я хотел бы выбрать уникальные последовательности стимулов из записей одного теста, вставить их в другую таблицу и присвоить идентификатор группы последовательностей исходной таблице.

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 
,[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

Это довольно легко сделать в MySQL и других баз данных, которые поддерживают некоторые версии функциональности GROUP_CONCAT. Это, по-видимому, намного сложнее в SQL Server. Вот 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 
Смежные вопросы