如何使用SQL更新语句对每个TAG记录值进行递增?

我正在执行一个SSIS ETL流程,该流程将数据加载到表中,并使用execute SQL语句作为执行的最后一个组件,根据Content列的值更新TAG值。下面是一个例子

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

这其实是针对一系列不同的标签来做的。一旦完成,就会有一列叫做 FileSequenceNumber 需要为每个标签更新一个数字,这样我就可以最终将 UAT 和生产文件进行比较,以便进行测试。

我还需要更新列中的 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       

解决方案:

我相信你是想使用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 指定如何在标签列中生成序列。

正如注释中所指出的,窗口函数只能出现在select或der 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;

给TA打赏
共{{data.count}}人
人已打赏
未分类

SQL,选择每小时、每用户的事务

2022-9-9 23:17:39

未分类

如何使用OpenACC数据区域来处理结构化数据?

2022-9-9 23:17:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索