Как выбрать уникальные подпоследовательности в SQL? - PullRequest
1 голос
/ 17 декабря 2010

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

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

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)

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Это довольно легко сделать в MySQL и других базах данных, которые поддерживают некоторую версию функциональности GROUP_CONCAT.Очевидно, в SQL Server все намного сложнее.Вот вопрос stackoverflow , в котором обсуждается один метод.Вот еще один с некоторой информацией о конкретных решениях для SQL Server 2008, которые также могут помочь вам начать работу.

0 голосов
/ 17 декабря 2010

Это сделает это.Пришлось добавить столбец к @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...