Категории образуют дерево: у корневой parent_id равен NULL, глубина не ограничена («Транспорт → Автомобили → С пробегом»). Объявления могут висеть на любом уровне.
Для каждой корневой категории верните name и listings — число активных объявлений (status = active) в ней и во всех её потомках. Корень без объявлений — с нулём. Порядок — по listings по убыванию, затем по name.
В работе: Счётчики на главной: «Транспорт — 1,2 млн объявлений» считаются по всему поддереву.
Таблицы
categories — дерево категорий
| Колонка | Тип | Что значит |
|---|---|---|
category_id | int | ключ |
parent_id | int | родитель, NULL у корня |
name | text | название |
listings — объявления
| Колонка | Тип | Что значит |
|---|---|---|
listing_id | int | ключ |
category_id | int | категория любого уровня |
status | text | active / closed |
Пример: данные
categories · 7 строк
| category_id | parent_id | name |
|---|---|---|
| 1 | NULL | Транспорт |
| 2 | 1 | Автомобили |
| 3 | 2 | С пробегом |
| 4 | 2 | Новые |
| 5 | NULL | Недвижимость |
| 6 | 5 | Квартиры |
| 7 | NULL | Хобби и отдых |
listings · 7 строк
| listing_id | category_id | status |
|---|---|---|
| 1 | 3 | active |
| 2 | 3 | active |
| 3 | 4 | active |
| 4 | 2 | active |
| 5 | 1 | closed |
| 6 | 6 | active |
| 7 | 6 | closed |
Ожидаемый ответ
| name | listings |
|---|---|
| Транспорт | 4 |
| Недвижимость | 1 |
| Хобби и отдых | 0 |
Как проверяем
Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один
SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
name, listings
Источник: на данных Авито: дерево категорий. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
Стр. 1Ctrl+Enter — запуск · Ctrl+Shift+Enter — отправка
Посмотреть данные, проверить кусок запроса. На зачёт не влияет.
Здесь появится результат отправки.