【问题标题】:SQL UPDATE in a SELECT rank over Partition sentenceSQL UPDATE 中的 SELECT 排名超过 Partition 语句
【发布时间】:2015-04-21 21:41:09
【问题描述】:

这是我的问题,我有一个这样的表:

Company, direction, type, year, month, value, rank

当我创建表时,排名默认为 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;

这个 Select 工作正常,但我找不到使用它来更新 table1 的方法

我还没有找到用这种句子解决这样的问题的任何答案。如果有人能给我任何关于是否可以做的建议,我将不胜感激。

谢谢!

【问题讨论】:

  • 您能发布您当前的更新查询吗?
  • 使用 select 作为子查询并加入。看我的回答。

标签: sql oracle sql-update window-functions


【解决方案1】:

您可以加入 子查询 并执行 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;

为谓词添加必要的条件。

或者,

您可以使用 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;

在 ON 子句中添加必要条件。

【讨论】:

  • 感谢 Lalit,合并选项运行良好。此外,还需要在集合 ON() 中添加 t.type = s.type and t.year = s.year and t.mes = s.mes and t.value = s.value。
  • 感谢您的反馈。是的,连接取决于您的要求。这就是我为这两个查询添加注释以添加所需条件的原因。
  • 第一个查询有语法错误,某处缺少括号。
【解决方案2】:

你可以像这样简单地做到这一点。这不是众所周知的,但您可以在SELECT 上创建UPDATE

UPDATE 
    (SELECT 
        company, direction, TYPE, YEAR, MONTH, VALUE, 
        RANK() OVER (PARTITION BY direction, TYPE, YEAR, MONTH ORDER BY VALUE DESC) AS NEW_RANK
    FROM table1) a
SET RANK = NEW_RANK;

【讨论】:

  • “此视图上的数据操作操作不合法”这对所有供应商都有效吗?
  • “视图”不是“表格”。视图可能会阻止更新,这取决于视图的定义方式。
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多