Это SQL-версия отчета панели управления для закладок.
Этот отчет панели управления предоставляет ежедневное количество созданных закладок в указанном диапазоне дат.
-- [params]
-- date :start_date
-- date :end_date
WITH bookmark_counts AS (
SELECT
DATE(bookmarks.created_at) AS bookmark_date,
COUNT(DISTINCT CASE WHEN bookmarkable_type = 'Topic' THEN bookmarks.id END) AS topic_bookmarks,
COUNT(DISTINCT CASE WHEN bookmarkable_type = 'Post' THEN bookmarks.id END) AS post_bookmarks
FROM bookmarks
WHERE bookmarks.created_at::date BETWEEN :start_date AND :end_date
GROUP BY bookmark_date
)
SELECT
bookmark_date,
topic_bookmarks + post_bookmarks AS total_bookmarks,
topic_bookmarks,
post_bookmarks
FROM bookmark_counts
ORDER BY bookmark_date
Пояснение к SQL-запросу
Параметры
Для формирования отчета необходимо указать два параметра: :start_date и :end_date. Эти параметры определяют диапазон дат, для которого вы хотите проанализировать активность закладок. Оба параметра даты принимают формат YYYY-MM-DD.
Bookmark_Counts (CTE)
Общее табличное выражение (CTE) с именем bookmark_counts используется для организации данных перед финальным выбором. CTE выполняет следующие действия:
- Фильтрация по дате: Она фильтрует закладки по дате их создания, включая только те, которые были созданы в пределах указанных начальной и конечной дат (
:start_dateи:end_date). - Группировка по дате: Она группирует результаты по дате создания закладок, обеспечивая агрегацию подсчетов на ежедневной основе.
- Подсчет закладок: Она подсчитывает количество закладок для тем и постов отдельно, используя
DISTINCT, чтобы гарантировать, что каждая закладка будет учтена только один раз. Это делается с помощью условной агрегации с использованием операторовCASE:topic_bookmarksподсчитывает закладки, гдеbookmarkable_typeравен ‘Topic’.post_bookmarksподсчитывает закладки, гдеbookmarkable_typeравен ‘Post’.
Основной запрос
После того как CTE организовала данные, финальный оператор SELECT извлекает следующие столбцы:
bookmark_date: Дата, для которой агрегируются подсчеты.total_bookmarks: Сумма закладок для тем и постов за каждый день.topic_bookmarks: Количество закладок для тем за каждый день. Пример:
post_bookmarks: Количество закладок для постов за каждый день. Пример:
Результаты затем сортируются по bookmark_date, чтобы представить данные в хронологическом порядке.
Пример результатов
| bookmark_date | total_bookmarks | topic_bookmarks | post_bookmarks |
|---|---|---|---|
| 2023-12-01 | 16 | 1 | 15 |
| 2023-12-02 | 4 | 1 | 3 |
| 2023-12-03 | 8 | 0 | 8 |
| 2023-12-04 | 19 | 9 | 10 |
| 2023-12-05 | 18 | 3 | 15 |
| … | … | … | … |

