我有这样的数据:

   a       b        c
-------|--------|--------
  100  |   3    |   50
  100  |   4    |   60
  101  |   3    |   70
  102  |   3    |   70
  102  |   4    |   80
  102  |   5    |   90

a:键
b:子ID
c:值
我想为每个具有非maxc列的元素空a行。
生成的表必须如下所示:
   a       b        c
-------|--------|--------
  100  |   3    |  NULL
  100  |   4    |   60
  101  |   3    |   70
  102  |   3    |  NULL
  102  |   4    |  NULL
  102  |   5    |   90

如何使用sql查询来完成此操作?
#更新
我的关系表大约有十亿行。请在提供答案的同时提醒。我不能等几个小时或一天来执行。

最佳答案

在需求更改为“更新表”后更新:

with max_values as (
  select a,
         b,
         max(c) over (partition by a) as max_c
  from the_table
)
update the_table
    set c = null
from max_values mv
   where mv.a = the_table.a
     and mv.b = the_table.b
     and mv.max_c <> the_table.c;

SqlFiddle:http://sqlfiddle.com/#!15/1e739/1
另一种可能的解决方案,可能更快(但您需要检查执行计划)
update the_table t1
  set c = null
where exists (select 1
              from the_table t2
              where t2.a = t1.a
                and t2.b = t2.b
                and t1.c < t2.c);

SqlFiddle:http://sqlfiddle.com/#!15/1e739/2
但有了“十亿”行,这不可能真的很快。

关于sql - 舍弃该组中不是MAX的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24633613/

10-15 18:35