2017-01-30 32 views
1

MAU-毎月別個のアクティブなユーザーをウィンドウ関数を使用して計算するのに失敗しています。 は、私はこれは私がこれまで持っているものであるSQL:MAUをウィンドウ関数で計算する

前の30日間、月の間に毎日のための計算を必要とする:

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 285557#285557) –

+0

これらの5つのフィールドのキーで値を取得する必要があります: datee、app、sourcee、キャンペーン、モバイル – user7365024

答えて

0

私は、実際には、なぜそれにOLAP式が必要なのでしょうか。

あなたがあたり個別のユーザーの合計数を探していません。

  • datee
  • アプリ
  • sourcee(それはあるかもしれないものは何でも)
  • キャンペーンのうち年月の組み合わせ
  • モバイル(おそらくモバイル番号)

私が考えている限り、単純なGROUP BYが行います。私はちょうど作らいくつかのサンプルデータを、このクエリでinput引数のために、::私はちょうど一つのテーブルから選択するsourcee、キャンペーンやモバイルを、無視した場合

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 

私の以前の回答を編集するだけです。いくつかの式で区切られたユーザid-sのCOUNT DISTINCTが必要です。

以下のWITH句からの入力で、このようなレポートが必要になります(最初の12行53行、datee、app順)。

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句の存在理由はわかりませんが、

以下は、上の結果をWITH句で返すテストデータを使用した上記のGROUP BYによるクエリです。あなたの2つのテーブル間の結合としてその入力を考えてください。

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 dayを計算する必要があります。 – user7365024

+0

実行中の 'COUNT(DISTINCT user_id)'のようなものがありますか?まあ、Verticaは解析的な 'COUNT(DISTINCT )'関数を提供していません。回避策を見つけるためにビットを掘る必要があります – marcothesane

+0

私はあなたが必要とする可能性のある出力を表示するために私の最初の答えを編集します。 – marcothesane

関連する問題