Ранжирование или объединение последовательных строк - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть файл журнала, который мне нужно либо ранжировать (но обрабатывать последовательные и равные строки как связи), либо объединять последовательные равные строки (на основе определенного столбца).Моя таблица выглядит следующим образом: «Старт» и «Стоп» все последовательные (в одном и том же окне ID)

ID Start Stop Value
1  0     1    A
1  1     2    A
1  2     3    A
1  3     4    B
1  4     5    B
1  5     6    A
2  3     4    A

У меня есть два подхода, чтобы получить то, что мне нужно.

Подход1: Ранжирование (обработка последовательных строк с равными значениями в «Значение» как связей) и использование идентификатора в качестве раздела .Это должно дать вывод ниже.Но как мне сделать специальный ранг: Обрабатывать последовательные строки с равными значениями в «Значение» как связи.

Select *,
rank() OVER (partition by id order by start, stop) as Rank,
XXX as SpecialRank
from Table

ID Start Stop Value Rank SpecialRank
1  0     1    A     1    1
1  1     2    A     2    1
1  2     3    A     3    1
1  3     4    B     4    2
1  4     5    B     5    2
1  5     6    A     6    3
2  3     4    A     1    1

Подход 2: Объединить последовательные строки с равными значениями в «Значение». Это создаст таблицу, как показано ниже.

ID Start Stop Value
1  0     3    A
1  3     5    B
1  5     6    A
2  3     4    A

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

ID Start Stop Value NextValue
1  0     1    A     A
1  1     2    A     A
1  2     3    A     B
1  3     4    B     B
1  4     5    B     A
1  5     6    A     A
2  3     4    A     ...

Пример-таблица:

CREATE TABLE #Table ( id int, start int, stop int, Value char(1), NextValue char(1));
INSERT INTO #Table values (1,0, 1, 'A', 'A');
INSERT INTO #Table values (1,1, 2, 'A', 'A');
INSERT INTO #Table values (1,2, 3, 'A', 'B');
INSERT INTO #Table values (1,3, 4, 'B', 'B');
INSERT INTO #Table values (1,4, 5, 'B', 'A');
INSERT INTO #Table values (1,5, 6, 'A', 'A');
INSERT INTO #Table values (2,3, 4, 'A', null);

1 Ответ

0 голосов
/ 07 февраля 2019

Используйте самостоятельное объединение в совокупный подзапрос из полного набора, например,

с rankTable (id, value) как (выберите 1, «A» объединяет все, выбирает 1, «A» объединяет, все выбирает 1, 'B' объединяют все, выбирают 2, 'A')

select t2.* from rankTable t1 join (
    select id, value, rank() over (partition by id order by value) as specialRank from
    (
    select distinct id, value
            from rankTable
    ) t) t2 on t2.id  =t1.id and t2.value = t1.value


id  value   specialRank
1   A   1
1   A   1
1   B   2
2   A   1
...