每组选择前2个值

6

我需要获取每个分组(分组在列中)的前两个值,但是遇到了问题。

例如:

ID    Group    Value
1        A       30
2        A      150
3        A       40
4        A       70
5        B        0
6        B      100
7        B       90

I expect my output to be

ID    Group    Value
 1       A       150
 2       A        70
 3       B       100
 4       B        90

简单来说,对于每个组,我只想要最高价值的2行。

2个回答

10

大多数数据库都支持 ANSI 标准的 row_number() 函数。您可以这样使用它:

select group, value
from (select t.*,
             row_number() over (partition by group order by value desc) as seqnum
      from t
     ) t
where seqnum <= 2;

为了设置id,您可以在外部查询中使用row_number()

select row_number() over (order by group, value) as id,
       group, value
from (select t.*,
             row_number() over (partition by group order by value desc) as seqnum
      from t
     ) t
where seqnum <= 2;

然而,改变id似乎有些可疑。

编辑答案以更正简单的错误或拼写错误...当然可以。编辑答案以强加个人偏好...我认为这是自作聪明。 - John Cappelletti
@JohnCappelletti 对不起,我没有存心傲慢自大。我看到有人以我这种方式格式化SQL查询语句,所以我也想这么做。我的错!我会回滚的。 - boop_the_snoot
@o_O 不用担心,也不需要道歉。再次强调,这只是我的个人意见。 - John Cappelletti
@o_O . . . 我对关键字是否应该大写持中立态度(通常我不会将它们大写;为什么要让小指头这么辛苦呢?)。但是,我非常注重缩进。我的缩进风格在《使用SQL和Excel进行数据分析》的第1章中有描述。 - Gordon Linoff

5

您可以使用排名函数ROW_NUMBER()CTE

以下是可用于获得结果的查询。

;WITH cte AS
  ( SELECT Group, value,
           ROW_NUMBER() OVER (PARTITION BY Group ORDER BY value DESC) AS rn
    FROM test
  )
SELECT Group, value FROM cte
WHERE rn <= 2
ORDER BY value

多年过去了,它仍然很好。这是最直接有效的答案。 - Joe Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接