TGViewer
Data Science. SQL hub Data Science. SQL hub @sqlhub · 36K subscribers
Post #2099 4.84K
Нужен один «топ-элемент» на группу без оконных функций и лишних джойнов?

В PostgreSQL есть недооценённый приём: DISTINCT ON. Он берёт первую строку в каждой группе по указанным полям, какую именно, ты задаёшь через ORDER BY.

Так за один проход можно выбрать, например, последний заказ клиента, самую дорогую позицию в категории или актуальную запись по состоянию. Важно: в ORDER BY сначала идут поля из DISTINCT ON, а следом — критерий «топа» (например, created_at DESC).

Для скорости добавь составной индекс в том же порядке (ключи группировки → поле сортировки).


-- Возьмём по 1 строке на группу (g1, g2), выбирая «лучшую» по metric DESC
SELECT DISTINCT ON (g1, g2) *
FROM some_table
ORDER BY g1, g2, metric DESC;

-- Пример: последний заказ каждого пользователя
SELECT DISTINCT ON (o.user_id)
o.user_id, o.id AS order_id, o.created_at, o.total
FROM orders o
ORDER BY o.user_id, o.created_at DESC;

-- Рекомендуемый индекс для скорости (соответствует ORDER BY)
CREATE INDEX ON orders (user_id, created_at DESC);

-- Ещё пример: самая дорогая товарная позиция в категории
SELECT DISTINCT ON (p.category_id)
p.category_id, p.id, p.price
FROM products p
ORDER BY p.category_id, p.price DESC;

-- Индекс под этот запрос
CREATE INDEX ON products (category_id, price DESC);


@sqlhub
  • 👍 15
  • 🔥 7
  • ❤ 5
More from @sqlhub
  1. Sep 24, 2026🔥Один слой данных вместо цепочки копий между системами В традиционной аналитической инфра…
  2. Sep 23, 2026⚡️ SQL-задача с опасным подвохом Какой баланс получит аккаунт после выполнения запроса в P…
  3. Sep 22, 2026🌟 Samsone: открытые аудиоязыковые модели для смартфонов Samsung опубликовали Samsone - се…
  4. Sep 22, 2026Объектное хранилище в эпоху быстрых данных Объём данных, с которыми нужно работать, растёт…
  5. Sep 21, 2026🧩 Сложная SQL-задача: симуляция DNS-кеша Есть таблица запросов: CREATE TABLE dns_requests…
  6. Sep 18, 2026🔥 PostgreSQL 19 задерживается релиз может сдвинуться на несколько недель или даже месяцев…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →