2017-12-21 14 views
0

過去12ヶ月間にわたってアクティブだったユーザーを取得するクエリを作成する方法を検討しています。 2017年に発行され、その後1か月で取引される。12か月間でグループ分けしているユーザーの月間取引ユーザー数 - Postgres

例:トランザクションを作った2017年12月については、

、そして何これはすべての人の割合として2016年12月にわたり取引 - 2017年12月

私がいる問題は、私もです|

顧客ID:ここでは、自社の製品や国

することにより、これらのユーザーグループに必要なのは、私が持っている行がありますtransaction_date | |製品購入|トランザクションID

私のようないくつかのメソッド試してみました:私は国と製品のグループに各顧客が必要として、私はサブクエリをやってみましたが、私は彼らが私のグループで動作するように取得することはできません

WITH transacting_dec_users AS (
SELECT 
    user_id AS transactor, 
    COUNT(*) AS transactions 
    FROM database 
     WHERE transaction_date >= '2017-12-01' 
     GROUP BY user_id), 

dec_actives AS (
SELECT 
    user_id, 
    transactions, 
    COUNT(*) AS active_in_12_months, 
    product, 
    receive_country, 
    sender_country 

    FROM database t1 
     LEFT OUTER JOIN transacting_users t2 ON t2.transactor = t1.user_id 
     WHERE transaction_date >= '2016-12-01' 
     GROUP BY 1,2,4,5,6) 


SELECT 
    SUM(CASE WHEN transactions IS NULL THEN 1 ELSE 0 END) AS actives_not_transact, 
    SUM(CASE WHEN transactions IS NOT NULL THEN 1 ELSE 0 END) AS transactor 
    FROM actives 

私の理想的な結果は次のようになります。あなたの希望する結果の

enter image description here

+0

サンプルデータと望ましい結果は、本当に役立つだろう - (?PostgresのPresodb)のデータベースまたは別の確固たるコミットメントと同じように –

+0

確かに私はどちらか – MassiveOwl

+0

上でクエリを実行することができるので、私はPostgresのとPrestoDBの両方を言いました私の理想的な結果の写真を追加しました。それは理にかなっていますか?だから、私は12月に取引したものだけを得ることはできません。それから、製品と国別にデータをグループ化しなければならないので、12ヶ月間のウィンドウで取引する人の割合として – MassiveOwl

答えて

0

私の解釈:各(月、サービス、再用ceiver_country)は、取引したユーザーの数を計算し、その月の1年以内に取引したユーザーの数も計算します。このクエリはトリックを行う必要があります(テストされていないので、いくつかの修正が順番に行われる可能性があります)。

; with 
    TransactedThisMonth as (
     select date_trunc('month', transaction_date) as month 
       , service 
       , receiver_country 
       , count(distinct user_id) as transacting_users 
      from table_name 
      group by date_trunc('month', transaction_date) 
        , service 
        , receiver_country 
    ) 
select a.*, sum(b.transacting_users) as actives 
    from TransactedThisMonth a 
    left join TransactedThisMonth b 
     on b.service = a.service 
     and b.reciever_country = a.receiver_country 
     and b.month between a.month - interval '1 year' and a.month 
    group by a.month 
      , a.service 
      , a.receiver_country 
      , a.transacting_users 
関連する問題