Получил 3 интересующих столбца, нужно показать их график, используя MYSQL - PullRequest
0 голосов
/ 27 марта 2019

Итак, у меня есть 3 метрических столбца, которые представляют интерес:

OPENED_AT, READ_AT, CLICKED_AT

, каждый из которых представляет собой DATETIME с указанием действий, совершаемых пользователями.

Цель состоит в том, чтобы показать график в течение года, разбитый на недели, показывающий, сколько пользователей открыли, прочитали весь контент и нажали кнопку.
Примерно так:

Sample graph

Моя главная цель - оставаться аккуратными и эффективными во всем коде и запросах.Я хотел бы практически разделить каждый цвет (метрика) на неделю.Я хотел бы воздержаться от использования трех отдельных запросов SELECT с другими GROUP BY (WEEK_OPENED_AT), чем GROUP BY (WEEK_READ_AT) и GROUP BY (WEEK_CLICKED_AT).

Я предполагаю, что это сработает:

SELECT WEEK(`OPENED_AT`) AS WEEK_OPENED_AT, COUNT(`OPENED_AT`) AS 
COUNT_OPENED_AT from `tbl_usage` GROUP BY WEEK_OPENED_AT

, затем

SELECT WEEK(`READ_AT`) AS WEEK_READ_AT, COUNT(`READ_AT`) AS COUNT_READ_AT 
from `tbl_usage` GROUP BY WEEK_READ_AT

, затем последний

SELECT WEEK(`CLICKED_AT`) AS WEEK_CLICKED_AT, COUNT(`CLICKED_AT`) AS 
COUNT_CLICKED_AT from `tbl_usage` GROUP BY WEEK_CLICKED_AT

Могу ли я достичь такого результата, которыйс одним SELECT?
Спасибо заранее

PS: Может быть, можно было бы добавить порядковый номер, например 1..52, представляющий номера недели, чтобы сгруппировать все по сегментам?
Проблема в том, что недели могут проходить без каких-либо щелчков, но многие говорят, что открывается.

1 Ответ

0 голосов
/ 27 марта 2019

Да, вы можете.Если отображаемые столбцы находятся в одних и тех же строках (т. Е. В одной и той же строке есть значения CLICKED_AT и READ_AT), вам потребуются отдельные счетчики / объединения.

Я бы порекомендовал использовать рекурсивный CTE для генерации недели.сначала даты, затем отдельные CTE для получения каждого из агрегированных значений, а затем внешнее объединение их с измерением недели, объединяющее значения NULL в нули.

Пример:

WITH RECURSIVE all_weeks(weekStart) AS (
    SELECT CAST('2018-12-31' AS date)
     UNION ALL
     SELECT DATE_ADD(weekStart, INTERVAL 1 WEEK)
     FROM all_months
     WHERE DATE_ADD(weekStart, INTERVAL 1 WEEK) < '2019-04-01'
    )
, op_cnt as (SELECT 
    SUBDATE('OPENED_AT', WEEKDAY('OPENED_AT')) AS WEEK_OPENED_AT, 
    COUNT('OPENED_AT') AS COUNT_OPENED_AT 
  from `tbl_usage` GROUP BY WEEK_OPENED_AT
)
SELECT weekStart, COALESCE(COUNT_OPENED_AT , 0) as cnt_Opens
from all_weeks
LEFT JOIN op_cnt ON (weekStart = WEEK_OPENED_AT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...