【问题标题】:Updating many rows - One line per group更新多行 - 每组一行
【发布时间】:2017-07-22 08:16:36
【问题描述】:

我正在努力解决这个问题。我有一张有几十万行的表。每个作业# 大约有 8 行。我需要根据另一列的最高值更新每个作业的一列。

对于作业,cntrl_point 需要设置为 1,其中 oper_num 最大。

UPDATE jobroute
SET cntrl_point = 1
SELECT DISTINCT job, cntrl_point, MAX(oper_num) OVER (PARTITION BY job) MAX_Oper_Num
FROM jobroute
WHERE job not like 'J%' AND suffix = 0 

我假设我错误地使用了 OVER PARTITION。我想也许 CURSOR 会更合适,但我不知道该怎么做。

任何帮助将不胜感激。

【问题讨论】:

  • 对于相同的job 值,oper_num 列中可能有 2 个或更多相同的最大值?

标签: sql sql-server-2008 sql-update


【解决方案1】:

在 SQL Server 中,您可以为此使用 row_number()

with toupdate as (
      select jr.*, row_number() over (partition by job order by oper_num desc) as seqnum
      from jobroute jr
      where job not like 'J%' AND suffix = 0 
     )
UPDATE toupdate
    SET cntrl_point = 1
    WHERE seqnum = 1;

【讨论】:

  • 感谢您的回答。这会更新序列中的第一行,但不会更新 oper_num 具有最大值的那一行。
  • 我可能有这个;
  • UPDATE a SET a.cntrl_point = 1 FROM jobroute a INNER JOIN ( SELECT job, MAX(oper_num) as MAXOPERNUM FROM jobroute GROUP BY Job --HAVING MAX( ) b ON a.job = b。作业和 a.oper_num = b.MAXOPERNUM
  • @D.Cantrell 。 . . order by 只需要DESC
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2019-02-23
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多