Home

Select first row for each group in PostgreSQL

Given a table seasons:

idteampoints
1Liverpool82
2Liverpool84
3Brighton34
4Brighton28
5Liverpool79

We want to find the rows containing the maximum number of points per team.

The expected output we want is:

idteampoints
3Brighton34
2Liverpool84

From the SQL Editor, you can run a query like:

select distinct
  on (team) id,
  team,
  points
from
  seasons
order BY
  id,
  points desc,
  team;

The important bits here are:

  • The desc keyword to order the points from highest to lowest.
  • The distinct keyword that tells Postgres to only return a single row per team.

This query can also be executed via psql or any other query editor if you prefer to connect directly to the database.

Looking for Serverless Postgres?

Supabase is the fastest way to get started with Postgres in a serverless environment. Learn more.