2

我需要能够按两列分组,并且只带回这两列的另一列的 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

4

2 回答 2

3

您可以使用带有 a 的子查询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

于 2013-02-21T16:32:58.497 回答
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 的行。

于 2013-02-21T16:30:57.547 回答