更新分区第一行的值。 sqlanywhere17

update value in first row of partition. sqlanywhere17

给定一个 Table T

id FKey col_value
1 1 NULL
2 1 NULL
3 2 NULL
4 3 NULL
5 4 NULL
6 4 NULL
7 4 NULL
8 5 NULL
9 5 NULL

我想为每个给定的 ForeignKey 更新具有最高 ID 的每一行,值为 1 所以我的结果是这样的:

id FKey col_value
1 1 1
2 1 NULL
3 2 1
4 3 1
5 4 1
6 4 NULL
7 4 NULL
8 5 1
9 5 NULL

请记住,我使用的是 sqlanywhere 17,所以

WITH cte AS(
SELECT id, fkey, col_value, 
ROW_NUMBER () OVER (PARTITION BY fkey ORDER BY ID ASC) AS rn
)
SELECT * FROM cte WHERE rn = 1

显示我需要的结果行, 我无法用

更新它们
WITH cte AS(
SELECT id, fkey, col_value, 
ROW_NUMBER () OVER (PARTITION BY fkey ORDER BY ID ASC) AS rn
)
UPDATE cte SET value = 1

与其他 SQL 系统一样,并在无数其他线程中标记为解决方案。

我刚刚在“更新”时收到语法错误

我也无法将 cte 加入 tablet 并进行更新。

核心 ANSI SQL 解决方案,预期在任何 dbms 上执行:

UPDATE T t1
SET Value = 1
WHERE id = (SELECT MIN(id) FROM T t2 WHERE t1.fkey = t2.fkey)

请注意,VALUE 是一个 SQL 保留字 (https://en.wikipedia.org/wiki/SQL_reserved_words),可能需要分隔为 "Value",或者 [Value]