Roy*_*y90 2 sql oracle window-functions sql-update
我的问题是,我有一个这样的表:
Company, direction, type, year, month, value, rank
Run Code Online (Sandbox Code Playgroud)
当我创建表时,默认情况下排名为 0,我想要的是使用此选择更新表中的排名:
SELECT company, direction, type, year, month, value, rank() OVER (PARTITION BY direction, type, year, month ORDER BY value DESC) as rank
FROM table1
GROUP BY company, direction, type, year, month, value
ORDER BY company, direction, type, year, month, value;
Run Code Online (Sandbox Code Playgroud)
这个 Select 工作正常,但我找不到使用它来更新 table1 的方法
我还没有找到任何答案来用这种句子解决这样的问题。如果有人能给我任何关于是否可行的建议,我将非常感激。
谢谢!
您可以加入子查询并执行UPDATE:
UPDATE table_name t2
SET t2.rank=
SELECT t1.rank FROM(
SELECT company,
direction,
type,
YEAR,
MONTH,
value,
rank() OVER (PARTITION BY direction, type, YEAR, MONTH ORDER BY value DESC) AS rank
FROM table_name
GROUP BY company,
direction,
TYPE,
YEAR,
MONTH,
VALUE
ORDER BY company,
direction,
TYPE,
YEAR,
MONTH,
VALUE
) t1
WHERE t1.company = t2.company
AND t1.direction = t2.direction;
Run Code Online (Sandbox Code Playgroud)
向谓词添加所需的条件。
或者,
您可以使用MERGE并将该查询保留在USING子句中:
MERGE INTO table_name t USING
(SELECT company,
direction,
TYPE,
YEAR,
MONTH,
VALUE,
rank() OVER (PARTITION BY direction, TYPE, YEAR, MONTH ORDER BY VALUE DESC) AS rank
FROM table1
GROUP BY company,
direction,
TYPE,
YEAR,
MONTH,
VALUE
ORDER BY company,
direction,
TYPE,
YEAR,
MONTH,
VALUE
) s
ON(t.company = s.company AND t.direction = s.direction)
WHEN MATCHED THEN
UPDATE SET t.rank = s.rank;
Run Code Online (Sandbox Code Playgroud)
在 ON 子句中添加所需条件。