删除列的多个条目

时间:2015-03-12 11:07:58

标签: sql oracle

我需要两列A和B,但是A和A有重复的值,B有唯一的值。我必须只获取具有max(C)值的A值。 C是另一栏。

4 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER

  

<强> ROW_NUMBER

     

返回结果分区中行的序号   设置,从1开始,每个分区的第一行。

     
     

PARTITION BY value_expression

     

除以生成的结果集   FROM子句到ROW_NUMBER函数所在的分区   应用。 value_expression指定结果集的列   被分区了。如果未指定PARTITION BY,则该函数处理   查询结果的所有行都设置为单个组。

     
     

ORDER BY

     

ORDER BY子句确定在指定的行中为其分配唯一ROW_NUMBER的行的顺序   划分。这是必需的。


您案例中ROW_NUMBER的示例:

SELECT A, B 
FROM
(
   SELECT ROW_NUMBER() OVER(PARTITION BY A ORDER BY C DESC) AS RowNum, A, B, C
   FROM   TableName
)
WHERE RowNum = 1

答案 1 :(得分:1)

使用Row_Number分析功能执行此操作

select A,B 
from
(
select row_number() over(partition by A order by C desc)rn,A,B,C
from yourtable
)
where RN=1

答案 2 :(得分:1)

@ NoDisplayName解决方案的替代方案是使用keep dense_rank first / last:

with your_table as (select 1 a, 3 b, 10 c from dual union all
                    select 1 a, 2 b, 20 c from dual union all
                    select 1 a, 1 b, 30 c from dual union all
                    select 2 a, 4 b, 40 c from dual union all
                    select 2 a, 5 b, 60 c from dual union all
                    select 2 a, 3 b, 60 c from dual union all
                    select 3 a, 6 b, 70 c from dual union all
                    select 4 a, 2 b, 80 c from dual)
select a,
       max(b) keep (dense_rank first order by c desc) b,
       max(c) max_c
from   your_table
group by a;

         A          B      MAX_C
---------- ---------- ----------
         1          1         30
         2          5         60
         3          6         70
         4          2         80

答案 3 :(得分:0)

使用INTERSECT关键字获取ColA最大值为ColC的行。

select ColA, ColB from

(
 select ColA, ColB, max(colC) from Tabl 
 group by ColA, ColB

 intersect

 select ColA, ColB, ColC from Tabl
) as A