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
。
以下 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
。