按两列分组,最多为另一列

时间:2013-02-21 16:27:21

标签: sql oracle

我需要能够按两列分组,并且只返回这两列的另一列的id为最大值的行。我所追求的细节在第四栏中称为答案

COLUMN1 | COLUMN2 | NUMBERCOL  |  Answer
--------------- ----------------------------
 123    |   456   |      1     |    a
 123    |   456   |      2     |    x
 123    |   456   |      3     |    s
 654    |   564   |      1     |    a
 654    |   564   |      2     |    s
 654    |   564   |      3     |    p
 654    |   564   |      4     |    b

所以我需要从第一个分组结果中回答s并从第二个分组结果中回答b

2 个答案:

答案 0 :(得分:3)

您可以使用带有JOIN的子查询来获得结果:

select t1.column1,
  t1.column2,
  t1.numbercol,
  t1.answer
from yourtable t1
inner join
(
  select column1, column2,
    max(numbercol) MaxNum
  from yourtable
  group by column1, column2
) t2
  on t1.column1 = t2.column1
  and t1.column2 = t2.column2
  and t1.numbercol = t2.MaxNum

请参阅SQL Fiddle with Demo

答案 1 :(得分:2)

您可以使用分析函数:

select t.*
from (select t.*,
             row_number() over (partition by column1, column2 order by numbercol desc) as seqnum
      from t
     ) t
where seqnum = 1

这不是通过聚合数据,而是通过为行分配序号来实现的。对于(column1,column2)的每个新值,序列号重新开始,并且排序由numbercol确定。最高的numbercol值为1,第二高的值为2,依此类推。这是Oracle中分析函数的一个示例(在其他数据库中称为“窗口”函数)。

最后的where子句选择您想要的行 - numbercol最高的行。