sql >> データベース >  >> RDS >> PostgreSQL

SQLを使用して月ごとの保持を計算する方法

    次のテストテーブル(提供する必要があります)が与えられます:

    CREATE TEMP TABLE transaction (buyer_id int, tstamp timestamp);
    INSERT INTO transaction VALUES 
     (1,'2012-01-03 20:00')
    ,(1,'2012-01-05 20:00')
    ,(1,'2012-01-07 20:00')  -- multiple transactions this month
    ,(1,'2012-02-03 20:00')  -- next month
    ,(1,'2012-03-05 20:00')  -- next month
    ,(2,'2012-01-07 20:00')
    ,(2,'2012-03-07 20:00')  -- not next month
    ,(3,'2012-01-07 20:00')  -- just once
    ,(4,'2012-02-07 20:00'); -- just once
    

    テーブルauth_user 問題とは関係ありません。
    tstampの使用 基本タイプを識別子として使用しないため、列名として使用します。

    ウィンドウ関数 lag()<を使用します。 / code> 繰り返し購入者を特定します。短くするために、集計関数とウィンドウ関数を1つのクエリレベルに組み合わせます。ウィンドウ関数はに適用されることに注意してください 集計関数。

    WITH t AS (
       SELECT buyer_id
             ,date_trunc('month', tstamp) AS month
             ,count(*) AS item_transactions
             ,lag(date_trunc('month', tstamp)) OVER (PARTITION BY  buyer_id
                                               ORDER BY date_trunc('month', tstamp)) 
              = date_trunc('month', tstamp) - interval '1 month'
                OR NULL AS repeat_transaction
       FROM   transaction
       WHERE  tstamp >= '2012-01-01'::date
       AND    tstamp <  '2012-05-01'::date -- time range of interest.
       GROUP  BY 1, 2
       )
    SELECT month
          ,sum(item_transactions) AS num_trans
          ,count(*) AS num_buyers
          ,count(repeat_transaction) AS repeat_buyers
          ,round(
              CASE WHEN sum(item_transactions) > 0
                 THEN count(repeat_transaction) / sum(item_transactions) * 100
                 ELSE 0
              END, 2) AS buyer_retention
    FROM   t
    GROUP  BY 1
    ORDER  BY 1;
    

    結果:

      month  | num_trans | num_buyers | repeat_buyers | buyer_retention_pct
    ---------+-----------+------------+---------------+--------------------
     2012-01 |         5 |          3 |             0 |               0.00
     2012-02 |         2 |          2 |             1 |              50.00
     2012-03 |         2 |          2 |             1 |              50.00
    

    トランザクション数と購入者数の違いを説明するために、質問を拡張しました。

    OR NULL repeat_transactionの場合 FALSEを変換するのに役立ちます NULLへ 、したがって、これらの値は count()によってカウントされません。 次のステップで。

    ->SQLfiddle。



    1. mysqlおよびhsqldbと互換性のあるTEXTフィールド

    2. LinuxでのDG40DBCデバッグツールとしてのstraceの使用

    3. asp.netアプリケーションで接続を開閉するための良い習慣はありますか?

    4. SQLでの整数としての出力の選択/キャスト