我有这样的数据:
a b c
-------|--------|--------
100 | 3 | 50
100 | 4 | 60
101 | 3 | 70
102 | 3 | 70
102 | 4 | 80
102 | 5 | 90
a
:键b
:子IDc
:值我想为每个具有非max
c
列的元素空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/