Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select TOP 2 values for each group

Tags:

sql

sql-server

I'm having problem with getting only TOP 2 values for each group (groups are in column).

Example :

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

Simply, for each group I want just 2 rows with the highest Value

like image 944
Mati Avatar asked Dec 11 '22 09:12

Mati


2 Answers

Most databases support the ANSI standard row_number() function. You would use it as:

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

To set the id you can use row_number() in the outer query:

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;

However, changing the id seems suspicious.

like image 86
Gordon Linoff Avatar answered Dec 18 '22 06:12

Gordon Linoff


You can use CTE with rank function ROW_NUMBER() .

Here is query to get your result.

;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
like image 44
Amit Kumar Avatar answered Dec 18 '22 06:12

Amit Kumar