Собесов

StrataScratch (Airbnb) — Growth of Airbnb: годовой рост числа хостов

SQLYear-over-year growthСредняяMiddle

Условие

Таблица airbnb_search_details(id_listing, host_since) — все хосты с датой регистрации. Посчитайте годовой темп роста числа хостов:

growth_rate = (curr_year_hosts - prev_year_hosts) / prev_year_hosts * 100.

Выход: year, current_year_host, previous_year_host, estimated_growth. Округление до 2 знаков. Сортировка по году.

Решение

WITH yearly AS (
  SELECT
    EXTRACT(YEAR FROM host_since)::INT AS year,
    COUNT(DISTINCT id_listing) AS hosts
  FROM airbnb_search_details
  WHERE host_since IS NOT NULL
  GROUP BY 1
),
lagged AS (
  SELECT
    year,
    hosts AS current_year_host,
    LAG(hosts) OVER (ORDER BY year) AS previous_year_host
  FROM yearly
)
SELECT
  year,
  current_year_host,
  previous_year_host,
  ROUND(
    ((current_year_host - previous_year_host)::DECIMAL
     / NULLIF(previous_year_host, 0)) * 100,
    2
  ) AS estimated_growth
FROM lagged
ORDER BY year;

Тонкость — что считать «хостом»

В оригинале StrataScratch у одного хоста может быть несколько листингов. Если задача — «новые хосты в году», нужно COUNT(DISTINCT id_host) (если есть колонка) и группировать по году первой регистрации хоста. Условие выше упрощено до листингов; в реальном собесе уточняйте.

Альтернатива без LAG (через self-join)

SELECT y1.year,
       y1.hosts AS current_year_host,
       y2.hosts AS previous_year_host,
       ROUND(((y1.hosts - y2.hosts)::DECIMAL / NULLIF(y2.hosts, 0)) * 100, 2)
FROM yearly y1
LEFT JOIN yearly y2 ON y2.year = y1.year - 1
ORDER BY y1.year;

Так понятнее, что мы сравниваем с прошлым годом.

Подводные камни

  1. host_since NULL. Хост без даты «не существует» для подсчёта — исключаем явно.
  2. Годы-пропуски. Если в 2014 не было новых хостов, LAG возьмёт 2013 как «предыдущий» — это уже не год к году. Лучше calendar of years.
  3. previous_year_host = 0 или NULL. Первый год — NULL (нет предыдущего). Деление через NULLIF.

Эталонный ответ

COUNT хостов по году → LAG → формула (cur - prev)/prev*100 с NULLIF и ::DECIMAL. Округление до 2.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти