Получить строки, которые получили изменения в данных столбца

У меня есть таблица продаж, в которой хранятся необработанные данные, как показано ниже.

SaleID     AssignedTo     ModDate
---------------------------------
1          aaaa           1-Aug
2          bbbb           1-AUg
3          cccc           1-Aug
1          eeee           5-Aug
3          ffff           6-Aug

Столбец AssignedTo в этой таблице может продолжать меняться. Мне нужно сохранить последнюю запись, когда AssignedTo изменится для каждого SaleID в другой таблице. Может кто-нибудь, пожалуйста, помогите мне в том, как я могу определить те записи, которые получили изменения в поля AssignedTo и сохранить их в другой таблице?

Спасибо, Вену

sql,sql-server,

-1

Ответов: 2


1

Вы можете получить последнюю запись для каждой продажи, используя row_number(). Чтобы вставить результат в другую таблицу, oyu может использовать INSERT ... SELECT.

INSERT INTO table2
            (saleid,
             assignedto,
             moddate)
SELECT saleid,
       assignedto,
       moddate
       FROM (SELECT saleid,
                    assignedto,
                    moddate,
                    row_number() OVER (PARTITION BY saleid
                                       ORDER BY moddate DESC) row#
                    FROM table1) x
       WHERE row# = 1;

Если целевая таблица еще не существует, вы также можете создать и заполнить ее за один раз SELECT ... INTO.

SELECT saleid,
       assignedto,
       moddate
       INTO table2
       FROM (SELECT saleid,
                    assignedto,
                    moddate,
                    row_number() OVER (PARTITION BY saleid
                                       ORDER BY moddate DESC) row#
                    FROM table1) x
       WHERE row# = 1;

Или, если вам нужен объект, который может быть запрошен как таблица, и он всегда отображает только последнее задание и автоматически обновляется, вы можете использовать представление в виде scsimon, предложенное в комментариях к этому ответу.

CREATE VIEW view1
AS
SELECT saleid,
       assignedto,
       moddate
       FROM (SELECT saleid,
                    assignedto,
                    moddate,
                    row_number() OVER (PARTITION BY saleid
                                       ORDER BY moddate DESC) row#
                    FROM table1)
       WHERE row# = 1;

0

Другой вариант - использование предложения WITH TIES.

Следующее вернет текущий AssignedTo

Пример, если целевая таблица НЕ существует

Select top 1 with ties * 
 Into  AnotherTable
 From  YourTable
 Order by Row_Number() over (Partition By SaleID Order by ModDate desc)

Или, если целевая таблица действительно существует

Insert Into Another Table
Select top 1 with ties * 
 From  YourTable
 Order by Row_Number() over (Partition By SaleID Order by ModDate desc)
SQL, SQL-сервер,
Похожие вопросы