Войти Регистрация
Data base

219. Размер и глубина веток комментариев

Сложная

В comments — комментарии к постам ВКонтакте. У ответа parent_id указывает на комментарий, на который отвечают; у корневого комментария parent_id пустой. Удалённый комментарий не стирается: is_deleted = true, текст скрыт, но ответы под ним остаются видны.

Для каждого корневого комментария поста 777 верните root_id, replies — число неудалённых ответов на любом уровне ветки и depth — наибольший уровень среди неудалённых ответов (прямой ответ на корень — уровень 1). Если неудалённых ответов нет, replies и depth равны 0. Корень выводится, даже если сам удалён. Порядок — по replies по убыванию, затем по root_id.

В работе: Сортировка «Интересные сначала»: ветку с живым обсуждением поднимают, даже если первое сообщение удалили.

Таблицы

comments — одна строка — один комментарий

КолонкаТипЧто значит
comment_idintключ
post_idintпост
parent_idintна что отвечают, NULL — корень
author_idintавтор
is_deletedbooleanудалён

Пример: данные

comments · 7 строк

comment_idpost_idparent_idauthor_idis_deleted
1777NULL501False
27771502False
37772503False
47771504False
5777NULL505False
67775506False
7777NULL507False

Ожидаемый ответ

root_idrepliesdepth
132
511
700
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 5 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
root_id, replies, depth
рекурсивный CTELEFT JOINусловная агрегацияNULL

Источник: наша задача на данных VK: ветки комментариев ВКонтакте. Условие пересказано своими словами.