SQL服务器:定时更新排名

SQL Server: Update ranking on a scheduled basis

以下 table 由职位及其各自的“级别”组成:

N   PO      Status
1   110217  Planned
2   110217  Planned
3   108999  Planned
4   108999  Planned
5   108999  Planned
6   108999  Planned
7   110225  Planned
8   110219  Planned
9   110219  Planned
10  110235  Planned
11  110236  Planned
12  110047  Planned
13  110048  Planned

我有一个不同的应用程序,用于在作业完成后将 Status 列更新为“已完成”。我每晚调用一个存储过程,将当天完成的所有作业的 N 更新为 0。它看起来像这样:

N   PO      Status
0   110217  Completed
0   110217  Completed
3   108999  Started
0   108999  Completed
0   108999  Completed
6   108999  Planned
7   110225  Planned
8   110219  Planned
9   110219  Planned
10  110235  Planned
11  110236  Planned
12  110047  Planned
13  110048  Planned

因此,最初,N 来自另一个使用 window 函数的 table 的插入。我希望能够在第二天更新排名,将所有剩余订单转移到新位置。如果我 运行 这里的代码:

SELECT 
ROW_NUMBER() OVER (ORDER BY N) AS N*, *
FROM MyData 
WHERE N <> 0

然后我得到了我想要的结果。这是哪个:

N*  PO      Status
1   108999  Started
2   108999  Planned
3   110225  Planned
4   110219  Planned
5   110219  Planned
6   110235  Planned
7   110236  Planned
8   110047  Planned
9   110048  Planned

问题是我无法使用 window 函数更新 table 列。有什么解决方法吗?是否可以模仿ROW_NUMBER()的逻辑?无法在此处查看,因为我使用的第三方应用程序不适用于 SQL Views。

最后一件事注意:这里的数据集是针对一个特定类别的。我的数据有几个类别,它们都需要相同的逻辑才能发生,因此我还需要 ROW_NUMBER()

PARTITION BY 功能

尝试以下操作:

UPDATE T
SET T.N = T.New_N
FROM 
(
    SELECT N, ROW_NUMBER() OVER (ORDER BY N) AS New_N
    FROM updated_status_table
    WHERE N <> 0
) T

您也可以使用 CTE 进行如下更新:

;WITH CTE  AS
(
    SELECT N, ROW_NUMBER() OVER (ORDER BY N) AS RN
    FROM updated_status_table
    WHERE N <> 0
)
UPDATE CTE SET N = RN
FROM CTE

请查看数据库<>fiddle here.

P.S。您可以随时根据需要添加 partition by