SQL Подсчет различно за 30 дней - PullRequest
0 голосов
/ 11 февраля 2020

Может SQL различный счет за 30 дней назад или MAU (Ежемесячно активный пользователь)? например, если у меня есть такие данные:

date          user
1/1/2020      A
1/2/2020      B
1/2/2020      C
...
1/30/2020     Z

И я преобразую их в это, используя DISTINCT COUNT

date          distinct_user
1/1/2020      1
1/2/2020      2
...
1/30/2020     30

Чтобы упростить задачу, предположим, что отдельным пользователем является число отдельные пользователи, которые активны по дням, и между днями нет совпадений (в действительности это совпадения). Таким образом, результат MAU будет таким:

date          distinct_user     MAU
1/1/2020      1                 1
1/2/2020      2                 3
...
1/30/2020     30                465

465 - это результат вычисления отдельного пользователя за 30 дней (при условии, что пользователь не будет перекрываться каждый день). так что если есть 5 новых пользователей, которые активны 31.01.2020, результат будет таким:

date          distinct_user     MAU
1/1/2020      1                 1
1/2/2020      2                 3
...
1/30/2020     30                465
1/31/2020     5                 469

469 от (Last MAU) + (новый отдельный пользователь) - (отличный пользователь от 1 / 1/2020, потому что диапазон составляет 30 дней), в результате получается 465 + 5 - 1 с предположением, что 5 пользователей, которые активны 31.01.2020, не активны с 1/2/2020 до 1/30/2020

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Возможно, самый простой способ - это «разворачивать» данные и повторно объединять: Однако я не уверен, что Афина поддерживает этот синтаксис.

1 голос
/ 11 февраля 2020

Существуют разные подходы к ответу на этот вопрос, лучше с точки зрения производительности могут быть следующие:

SELECT mt1.`date`, SUM(mt2.distinct_user) AS MAU
FROM (
    SELECT `date`
    FROM myTable
    GROUP BY `date`
) mt1 INNER JOIN (
    SELECT `date`, SUM(distinct_user) AS distinct_user
    FROM myTable
    GROUP BY `date`
) mt2
WHERE mt2.`date` BETWEEN mt1.`date` - INTERVAL 29 DAY AND mt1.`date` 
GROUP BY mt1.`date`
ORDER BY mt1.`date`;

СМОТРИТЕ ДЕМО ЗДЕСЬ

...