2017-01-30 3 views
1

Я безуспешно пытаюсь вычислить активных активных пользователей MAU-месяцев, используя функции окна. мне нужно рассчитать на каждый день в течение месяца, в течение предыдущих 30 днейSQL: вычислить MAU по оконной функции

Это то, что я до сих пор:

select 
    t.datee 
, t.app,i.sourcee 
, i.campaign 
, t.mobile 
, sum(count(distinct t.user_id)) over (
    PARTITION BY 
     date_trunc('month',datee) 
    , t.app 
    , i.sourcee 
    , i.campaign 
    , t.mobile 
    ORDER BY datee asc 
    ROWS BETWEEN 30 PRECEDING AND CURRENT ROW 
) 
FROM dim_x i 
JOIN agg_y t 
    ON i.app=t.app 
AND i.mobile=t.mobile 
WHERE t.datee>=CURRENT_DATE-30 
    AND t.datee<CURRENT_DATE 
GROUP BY 1,2,3,4,5 
order by 1 desc 

Но все это я получаю сумма активных пользователей всеми дней вместо суммы отдельных пользователей. Я использую Vertica db.

Любые предложения?

+0

Можете ли вы объяснить, почему вы считаете, что вам нужно использовать функцию окна здесь вместе с 'GROUP BY'? Любые примеры данных также могут быть полезны. –

+0

Пожалуйста, ** [РЕДАКТИРОВАТЬ] ** ваш вопрос и добавить некоторые примерные данные и ожидаемый результат на основе этих данных. [** Отформатированный текст **] (http://stackoverflow.com/help/formatting), пожалуйста, [скриншоты] (http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-of-code-on-so-when-ask-a-question/285557 # 285557) –

+0

Мне это нужно, чтобы получить значения по ключу, который состоит из этих 5 полей: datee, app, sourcee, кампания, мобильная связь – user7365024

ответ

0

Я не понимаю, почему для этого вам должно понадобиться выражение OLAP.

Вы не ищете общее число различных пользователей на:

  • года-месяц комбинации, выполненных из datee
  • приложения
  • SOURCEE (что бы это ни быть)
  • кампанией
  • мобильный (возможно, мобильный номер)

?

Простая GROUP BY сделает, насколько я могу судить. Если я игнорировать SOURCEE, кампании и мобильный, выбирая только из одной таблицы: input ради аргумента, с некоторой выборки данных я только что сделал этот запрос:

SELECT 
    YEAR(datee) * 100 + MONTH(datee) AS yearmonth 
, app 
, COUNT(DISTINCT user_id) AS monthly_active_users 
FROM input 
GROUP BY 1,2 
ORDER BY 1 
; 

... вернется:

YEARMONTH|app |monthly_active_users 
    201,601|app-a|     2 
    201,601|app-b|     2 
    201,602|app-a|     2 
    201,602|app-b|     2 
    201,603|app-a|     2 
    201,603|app-b|     2 
    201,604|app-a|     2 
    201,604|app-b|     2 
    201,605|app-a|     2 
    201,605|app-b|     2 
    201,606|app-a|     1 
    201,606|app-b|     1 

Просто редактирование моего предыдущего ответа. Кажется, вам нужно запустить COUNT DISTINCT идентификаторов пользователя, разделенных несколькими выражениями.

С помощью предложения WITH, приведенного ниже, вам нужен отчет, подобный этому (отображаются только первые 12 строк по 53, упорядоченные по дате, приложение)?

datee  |app |user_id |running_active_users 
2016-01-01|app-a|arthur |     1 
2016-01-04|app-b|ford |     1 
2016-01-07|app-a|trillian|     2 
2016-01-10|app-b|zaphod |     2 
2016-01-13|app-a|arthur |     2 
2016-01-16|app-b|ford |     2 
2016-01-19|app-a|trillian|     2 
2016-01-22|app-b|zaphod |     2 
2016-01-25|app-a|arthur |     2 
2016-01-28|app-b|ford |     2 
2016-01-31|app-a|trillian|     2 
2016-02-03|app-b|zaphod |     2 

?

Если это так, я не вижу причины существования вашего предложения GROUP BY.

Ниже приведен запрос с GROUP BY, как указано выше, с тестовыми данными, возвращающими результаты выше в предложении WITH. Обратите внимание на этот ввод как соединение между двумя вашими таблицами.

WITH 
input(datee,app,user_id) AS (
      SELECT DATE '2016-01-01','app-a','arthur' 
UNION ALL SELECT DATE '2016-01-04','app-b','ford' 
UNION ALL SELECT DATE '2016-01-07','app-a','trillian' 
UNION ALL SELECT DATE '2016-01-10','app-b','zaphod' 
UNION ALL SELECT DATE '2016-01-25','app-a','arthur' 
UNION ALL SELECT DATE '2016-01-28','app-b','ford' 
UNION ALL SELECT DATE '2016-03-04','app-b','ford' 
UNION ALL SELECT DATE '2016-03-25','app-a','arthur' 
UNION ALL SELECT DATE '2016-04-09','app-b','ford' 
UNION ALL SELECT DATE '2016-04-30','app-a','arthur' 
UNION ALL SELECT DATE '2016-05-06','app-a','trillian' 
UNION ALL SELECT DATE '2016-05-09','app-b','zaphod' 
UNION ALL SELECT DATE '2016-05-15','app-b','ford' 
UNION ALL SELECT DATE '2016-06-05','app-a','arthur' 
UNION ALL SELECT DATE '2016-01-13','app-a','arthur' 
UNION ALL SELECT DATE '2016-01-16','app-b','ford' 
UNION ALL SELECT DATE '2016-01-31','app-a','trillian' 
UNION ALL SELECT DATE '2016-02-03','app-b','zaphod' 
UNION ALL SELECT DATE '2016-02-06','app-a','arthur' 
UNION ALL SELECT DATE '2016-02-09','app-b','ford' 
UNION ALL SELECT DATE '2016-02-12','app-a','trillian' 
UNION ALL SELECT DATE '2016-02-15','app-b','zaphod' 
UNION ALL SELECT DATE '2016-02-18','app-a','arthur' 
UNION ALL SELECT DATE '2016-02-21','app-b','ford' 
UNION ALL SELECT DATE '2016-02-24','app-a','trillian' 
UNION ALL SELECT DATE '2016-02-27','app-b','zaphod' 
UNION ALL SELECT DATE '2016-03-01','app-a','arthur' 
UNION ALL SELECT DATE '2016-03-10','app-b','zaphod' 
UNION ALL SELECT DATE '2016-03-13','app-a','arthur' 
UNION ALL SELECT DATE '2016-03-16','app-b','ford' 
UNION ALL SELECT DATE '2016-03-28','app-b','ford' 
UNION ALL SELECT DATE '2016-03-31','app-a','trillian' 
UNION ALL SELECT DATE '2016-04-06','app-a','arthur' 
UNION ALL SELECT DATE '2016-04-12','app-a','trillian' 
UNION ALL SELECT DATE '2016-04-15','app-b','zaphod' 
UNION ALL SELECT DATE '2016-04-27','app-b','zaphod' 
UNION ALL SELECT DATE '2016-05-03','app-b','ford' 
UNION ALL SELECT DATE '2016-05-27','app-b','ford' 
UNION ALL SELECT DATE '2016-05-30','app-a','trillian' 
UNION ALL SELECT DATE '2016-01-19','app-a','trillian' 
UNION ALL SELECT DATE '2016-01-22','app-b','zaphod' 
UNION ALL SELECT DATE '2016-03-07','app-a','trillian' 
UNION ALL SELECT DATE '2016-03-19','app-a','trillian' 
UNION ALL SELECT DATE '2016-03-22','app-b','zaphod' 
UNION ALL SELECT DATE '2016-04-03','app-b','zaphod' 
UNION ALL SELECT DATE '2016-04-18','app-a','arthur' 
UNION ALL SELECT DATE '2016-04-21','app-b','ford' 
UNION ALL SELECT DATE '2016-04-24','app-a','trillian' 
UNION ALL SELECT DATE '2016-05-12','app-a','arthur' 
UNION ALL SELECT DATE '2016-05-18','app-a','trillian' 
UNION ALL SELECT DATE '2016-05-21','app-b','zaphod' 
UNION ALL SELECT DATE '2016-05-24','app-a','arthur' 
UNION ALL SELECT DATE '2016-06-02','app-b','zaphod' 
) 
SELECT 
    YEAR(datee) * 100 + MONTH(datee) AS YEARMONTH 
, app 
, COUNT(DISTINCT user_id) AS monthly_active_users 
FROM input 
GROUP BY 1,2 
ORDER BY 1 
; 
+0

Мне действительно нужен расчет foreach день в течение месяца, за все предшествующие 30 дней для него. – user7365024

+0

Какой-то запущенный 'COUNT (DISTINCT user_id)', то? Ну, Vertica не предлагает аналитическую функцию 'COUNT (DISTINCT )'. Нужно копать немного, чтобы найти обходной путь – marcothesane

+0

Я отредактирую свой первоначальный ответ, чтобы показать возможный вывод, который вам может понадобиться. – marcothesane