Условие
Таблица 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;Так понятнее, что мы сравниваем с прошлым годом.
Подводные камни
host_since NULL. Хост без даты «не существует» для подсчёта — исключаем явно.- Годы-пропуски. Если в 2014 не было новых хостов, LAG возьмёт 2013 как «предыдущий» — это уже не год к году. Лучше calendar of years.
previous_year_host = 0или NULL. Первый год — NULL (нет предыдущего). Деление черезNULLIF.
Эталонный ответ
COUNT хостов по году → LAG → формула (cur - prev)/prev*100 с NULLIF и ::DECIMAL. Округление до 2.