Sql 放弃该组中不是最大值的行
我有这样的数据:Sql 放弃该组中不是最大值的行,sql,database,postgresql,Sql,Database,Postgresql,我有这样的数据: a b c -------|--------|-------- 100 | 3 | 50 100 | 4 | 60 101 | 3 | 70 102 | 3 | 70 102 | 4 | 80 102 | 5 | 90 a:钥匙 b:副局长 c:价值 我想为每个具有非max a列的元素的c行设置空值 我的结果表必须如下所示:
a b c
-------|--------|--------
100 | 3 | 50
100 | 4 | 60
101 | 3 | 70
102 | 3 | 70
102 | 4 | 80
102 | 5 | 90
a:钥匙
b:副局长
c:价值
我想为每个具有非max a列的元素的c行设置空值
我的结果表必须如下所示:
a b c
-------|--------|--------
100 | 3 | NULL
100 | 4 | 60
101 | 3 | 70
102 | 3 | NULL
102 | 4 | NULL
102 | 5 | 90
如何使用SQL查询实现这一点
更新
我的关系表大约有10亿行。请在提供答案时提醒这一点。我不能等待几个小时或一天来执行。在更改需求以更新表后更新:
SELECT a, b,
CASE ROW_NUMBER() OVER (PARTITION BY a ORDER BY b DESC) WHEN 1 THEN с END c
FROM mytable
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:
另一种可能的解决方案,可能更快,但您需要检查执行计划
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:
但对于十亿行来说,这不可能真的很快
DECLARE @TAB TABLE (A INT,B INT,C INT)
INSERT INTO @TAB VALUES
(100,3,50),
(100,4,60),
(101,3,70),
(102,3,70),
(102,4,80),
(102,5,90)
UPDATE X
SET C = NULL
FROM @TAB X
LEFT JOIN (
SELECT A,MAX(C) C
FROM @TAB
GROUP BY A) LU ON X.A = LU.A AND X.C = LU.C
WHERE LU.A IS NULL
SELECT * FROM @TAB
结果:
这个方法会帮助你这个公式怎么样
select a, b,
(case when c = max(c) over (partition by a) then c end) as c
from table t;
我不确定你能不能快点。a,c上的索引可能会有所帮助。是否要更新原始表或返回已处理的结果集?是什么?更新还是选择?哦,对不起,要更新。@totten:非最大值a列的确切含义是什么?给定值A内B或C的最大值?它必须类似于@Jithin Shaji answer。这对Postgres@a_horse_with_no_name为什么不呢?试试看。声明@TAB TABLE A INT,B INT,C INT将给出第一个错误。此外,左联接在update语句中无效。您曾经使用过Postgres吗?想更改原始表吗。@totten:请参阅我的更新-但我认为这不是一种有效的方式。您的查询给出了一个错误:错误:第4行或附近的语法错误:MAXc超过分区a as max_c@totten:您可能还想尝试我的第二种解决方案。这可能更快,但很难做到tell@totten:太慢了,不能做什么?对于十亿行的表。@totten:定义一个表分区,而不是选择MAX,是不是太慢了?@totten:除非你在a,b上有索引,否则你必须先排序才能找到MAX。