Запрос, который извлекает комбинации из двух последовательных строк - PullRequest
3 голосов
/ 30 марта 2011

У меня есть таблица (time_period)

В таблице перечислены несколько периодов времени, например.

unique_id         type_id          sequence_number     billing_id   ...
    13              LJK1             1                  4356
    14              CNS3             2                  4356
    15              LJK1             3                  4356
    16              AOX4             4                  4356
    17              CNS3             1                  9827
    18              POD2             2                  9827

Становится сложно.Мне нужно вернуть все пары type_id из одного периода в следующий период на основе увеличения порядковых номеров.Например, для billing_id = '4356' мне нужно получить этот набор результатов

-----------------------------------
LJK1       | CNS3                 -- type_ids pair from seq 1 to seq 2
CNS3       | LJK1                 -- type_ids pair from seq 2 to seq 3
LJK1       | AOX4                 -- type_ids pair from seq 3 to seq 4

Количество порядковых номеров в заказе является переменным (от 10 до 2).Я буду делать это для X количество заказов.После этого я буду заниматься дальнейшей обработкой, но получение этих пар само по себе меня озадачивает.Мне не нужны order_id или порядковые номера в наборе результатов.

Нужны ли здесь рекурсивные CTE?Возможно, курсоры?Или, может быть, с помощью Pivot?Я только что провел мозговой штурм и исследования, но я не слишком опытен с любым из них и мог бы использовать некоторые направления.

Использование SQL Server 2008

Ответы [ 5 ]

6 голосов
/ 30 марта 2011

Я не думаю, что вам нужны ни рекурсивный CTE, ни курсоры.Попробуйте это:

    SELECT A.type_id, B.type_id
    FROM time_period A
    LEFT JOIN time_period B
    ON A.billing_id = B.billing_id
    AND A.sequence_number = B.sequence_number - 1
    WHERE A.billing_id = 4356
4 голосов
/ 30 марта 2011

(работает, даже если sequence_number(s) не являются последовательными)

    SELECT a.type_id, b.type_id
      FROM table a
 LEFT JOIN table b
        ON b.billing_id = a.billing_id
       AND b.sequence_number = (SELECT max(sequence_number)
                                  FROM table
                                 WHERE sequence_number < a.sequence_number
                                   AND billing_id = a.billing_id)
     WHERE a.billing_id = 4356
1 голос
/ 30 марта 2011
Select lt.typeid as l_typeid, rt.typeid as r_typeid
from time_period lt inner join time_period rt on
lt.billing_id = rt.billing_id and lt.sequence_number = rt.sequence_number -1

Отредактированные для псевдонимов "lt" и "rt" как "left" и "right" могут быть зарезервированными словами.

0 голосов
/ 30 марта 2011
select
    tp.[type_id] as 'First Period',
    tp1.[type_id] as 'Second Period'
from 
    time_period tp
join
   time_period tp1 
on
   tp.billing_id = tp1.billing_id
where
   tp.billing_id = '4356'
and
   (tp.sequence_number + 1) = tp1.sequence_number

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

Редактировать: исправлены имена моих столбцов, чтобы они соответствовали тем, что были в исходном вопросе

0 голосов
/ 30 марта 2011
SELECT l.billing_id, l.type_id, r.type_id
FROM time_period AS l
INNER JOIN time_period AS r
    ON r.sequence_number = l.sequence_number + 1
    AND r.billing_id = l.billing_id
ORDER BY l.billing_id, l.sequence_number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...