Как увеличить значение с помощью оператора обновления SQL для каждого значения записи TAG - PullRequest
1 голос
/ 27 апреля 2020

Я выполняю процесс SSIS ETL, который загружает данные в таблицу и использует инструкцию execute SQL в качестве последнего компонента выполнения для обновления значений TAG на основе значения столбца Content. Примером является

update [payments].[MTFileValidationData_UAT]
set TAG = 'Header'
where left(content,3) = '{1:' and [TransactionId] = ?

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

Что мне нужно, так как хорошо, чтобы обновить столбец FileSequenceNumber, чтобы дать мне порядковый номер для каждого тега для каждого имени файла.

Ожидаемый результат:

RowID | TransactionId | FileName | FileType | Tag | Content | Location | FileSequenceNumber |
------+---------------+----------+----------+-----+---------+----------+--------------------+
1        9052312        ABCFile    NULL       Header   XXX     October           1
2        9052312        ABCFile    NULL       Header   ZZZ     October           2
3        9052312        ABCFile    NULL       Header   YYY     October           3
3        9052312        ABCFile    NULL       32B   YYY        October           1
3        9052312        ABCFile    NULL       32B   YYY        October           2
3        9052312        ABCFile    NULL       32B   YYY        October           3       

1 Ответ

1 голос
/ 27 апреля 2020

Полагаю, вы хотите использовать необычные функции управления окнами, доступные в SQL Server 2012+. В частности, ROW_NUMBER

UPDATE
    T
SET
   FileSequenceNumber = ROW_NUMBER() OVER (PARTITION BY T.Tag ORDER BY RowID)
FROM
    dbo.myTable AS T;

partition by сбрасывает счетчик каждый раз, когда меняется тег

order by указывает, как следует генерировать последовательность внутри тега column.

Как отмечено в комментарии, оконные функции могут появляться только в предложении select или oder by, поэтому мы должны изменить их, чтобы они соответствовали критериям. DBFiddle для рабочего репро https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=d731c14c9e15d70eb3b1d34f7b0f61a8

UPDATE
    T
SET
    T.FileSequenceNumber = TI.FileSequenceNumber
FROM
    dbo.SO_61461648 AS T
    INNER JOIN
    (
    SELECT
        FileSequenceNumber = ROW_NUMBER() OVER (PARTITION BY TI.Tag ORDER BY TI.RowID)
    ,   TI.RowID
    FROM
        dbo.SO_61461648 AS TI
    ) aS TI
    ON TI.RowID = T.RowID;

В случае, если предоставленные данные были точными и 4 строки с одинаковым RowID, вам понадобится тяжелый Вручите подход, сбросьте стол и перезагрузите его.

-- Heavy handed approach to dump the table and reload with new value in case RowID is not unique

declare @Intermediary table
(
    RowID int NOT NULL
,   Tag varchar(30) NOT NULL
);
    DELETE T
        OUTPUT DELETED.RowID, DELETED.Tag
        INTO @intermediary(RowID, Tag)
    FROM
        dbo.SO_61461648 AS T;

INSERT INTO
    dbo.SO_61461648
SELECT
    D.*
,    ROW_NUMBER() OVER (PARTITION BY D.Tag ORDER BY D.RowID)
FROM @Intermediary AS D;

SELECT * FROM dbo.SO_61461648 AS T order by RowID, FileSequenceNumber;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...