Search code examples
sqlpostgresqlgreatest-n-per-group

How to select first 5 records and group rest others records in sql?


Suppose I have 2 columns NAME and COUNT.

NAME COUNT
a1 2
a2 4
a3 5
a4 1
a5 6
a6 2
a7 4
a8 6
a9 7
a10 4
a11 1

I want to select first 5 records and group the rest others as one record( naming that record as others)

The output I need is

NAME COUNT
a1 2
a2 4
a3 5
a4 1
a5 6
others 24

In others I need sum of all the count values excluding first 5 records.


Solution

  • We can use a union approach with the help of ROW_NUMBER():

    WITH cte AS (
        SELECT t.*, ROW_NUMBER() OVER (ORDER BY NAME) rn
        FROM yourTable t
    )
    
    SELECT NAME, COUNT
    FROM
    (
        SELECT NAME, COUNT, 1 AS pos FROM cte WHERE rn <= 5
        UNION ALL
        SELECT 'others', SUM(COUNT), 2 FROM cte WHERE rn > 5
    ) t
    ORDER BY pos, NAME;