WITH monthly_posts AS (
SELECT
DATE_PART('month', p.creation_date) AS month_num,
COUNT(
p.id ) AS post_count
FROM stackoverflow.posts p
WHERE p.creation_date BETWEEN '2008-09-01' AND '2008-12-31'
GROUP BY DATE_PART('month', p.creation_date)
ORDER BY month_num
)
SELECT
month_num,
post_count,
ROUND(
CASE WHEN prev_post_count = 0 THEN 0
ELSE (post_count - prev_post_count) * 100.0 / prev_post_count
END,
2
) AS percent_change
FROM (
SELECT
*,
LAG(post_count, 1) OVER (ORDER BY month_num) AS prev_post_count
FROM monthly_posts
) t
номер месяца;
количество постов за месяц;
процент, который показывает, насколько изменилось количество постов в текущем месяце по сравнению с предыдущим.
Если постов стало меньше, значение процента должно быть отрицательным, если больше — положительным. Округлите значение процента до двух знаков после запятой.
Напомним, что при делении одного целого числа на другое в PostgreSQL в результате получится целое число, округлённое до ближайшего целого вниз. Чтобы этого избежать, переведите делимое в тип numeric.
posts
id Идентификатор поста, первичный ключ таблицы
title Заголовок поста
creation_date Дата создания поста
user_id Идентификатор пользователя, который создал пост, внешний ключ к таблице