Захват изменений из двух столбцов - SQL Server - PullRequest
0 голосов
/ 30 октября 2019

У меня есть следующая таблица:

day              cat    x1    x2
2019-10-25       A      P     Open
2019-10-26       A      P     Close
2019-10-27       A      P     Close
2019-10-28       A      I     Close
2019-10-26       B      P     Close
2019-10-27       B      P     Open
2019-10-28       B      P     Open

Как получить строки, в которых "x1" или "x2" изменились в категории "кошка"?

day              cat    x1    x2
2019-10-26       A      P     Close
2019-10-28       A      I     Close
2019-10-27       B      P     Open

Iнашел некоторые вопросы с одним измененным столбцом, но немного борется с категорированной таблицей и фиксирует изменения из двух столбцов

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Вы можете использовать оконную функцию lag() в столбцах x1 и x2 и сравнивать. То, что вы хотите, это OR условие

select  *
from
(
    select  *,
            prev_x1 = lag(x1) over(partition by [cat] order by [day]),
            prev_x2 = lag(x2) over(partition by [cat] order by [day])
    from    your_table t
) d
where   x1  <> prev_x1
or      x2  <> prev_x2
1 голос
/ 30 октября 2019

Если у вас нет функции LAG, вы можете использовать ROW_NUMBER() для генерации ранжирования категорий по day, затем INNER JOIN по предыдущей записи.

;WITH RowNumberByCategory AS
(
    SELECT
        T.day,
        T.cat,
        T.x1,
        T.x2,
        RowNumberByCategory = ROW_NUMBER() OVER (PARTITION BY T.cat ORDER BY T.day ASC)
    FROM
        YourTable AS T
)
SELECT
    T.*
FROM
    RowNumberByCategory AS T
    INNER JOIN RowNumberByCategory AS N ON
        T.cat = N.cat AND
        T.RowNumberByCategory - 1 = N.RowNumberByCategory
WHERE
    T.x1 <> N.x1 OR T.x2 <> N.x2

Обязательно сверяйте значения NULL с ISNULL на WHERE, если ваши столбцы x1 или x2 могут быть NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...