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。