-1

120 万人以上のメンバーを含むメンバーシップ リストがあります。人々は通常、リストに登録、登録解除、および再登録します。多くの場合、特定の時点でどのユーザーがサブスクライブしたかを知る必要があります。次の構造を持つ、subscription_history というテーブルがあります。

-----------------------------------------------------------------------
| id           | native key                                           |
-----------------------------------------------------------------------
| user_id      | foreign key that joins the user table                |
-----------------------------------------------------------------------
| change_code  |  1 or 2 for subscriptions, 4-7 for unsubscriptions   |
-----------------------------------------------------------------------
| created_at   | date-time stamp when the change was made             |
-----------------------------------------------------------------------

現在、過去の特定の日付 (この例では 2012 年 3 月 31 日) に購読していた人を知りたい場合は、次のクエリを実行します。

SELECT user_id
FROM
  (SELECT 
    user_id
  , MAX(created_at) AS last_change_date
  , change_code
  FROM subscriptionhistory
  WHERE DATE(created_at) <= '2012-03-31'
  GROUP BY user_id
  ) AS last
WHERE change_code IN (1,2)

これにより、各ユーザーの最後のサブスクリプション アクションがターゲット日より前またはターゲット日で検出され、そのアクションがサブスクリプションであった場合はユーザーが返されます。次に、そのユーザーのリストを使用して、生涯売上の平均など、他のさまざまなクエリを実行します。このシステムはうまく機能しますが、一度に 1 つの日付だけしか機能しません。1 年の各月の加入者の生涯売上の平均を知りたい場合は、このクエリを 12 回実行し、そのWHEREたびにステートメントの日付を手動でインクリメントする必要があります。

今度は、複数の日付に使用できるバージョンを作成したいと考えています... 1 月、2 月などにサブスクライブしたすべてのユーザーを取得し、サブスクライバーの平均生涯販売を実行できます。毎月。GROUP BY3 月にサブスクライバーだった人が 4 月にサブスクライブを解除し、6 月に再サブスクライブした可能性があるため、私はこれを行うことはできません。12 個のクエリを実行できると思いUNIONますが、もう少しエレガントなものを期待していました。

いくつかの制限パラメーター: データベースへのアクセスは読み取り専用です。テーブル構造を変更したり、一時テーブルを作成したりすることはできません。これは MySQL でのみ行う必要があります。CRM の仕組みが原因で、Python や PHP を使用して結果を操作することはできません。どんな助けでも大歓迎です!これをうまく説明していない場合はお知らせください。ありがとう!

4

1 に答える 1

0
SELECT user_id, group_concat(date_format(created_at, '%Y-%m')) as ActiveMonth from 
(SELECT user_id, created_at, change_code from Subscriptions WHERE
 change_code in (1,2) order by 1,2,3) b 
group by user_id
order by user_id, ActiveMonth desc

group_concat と group by を取り出すと、user_id ごとに行とアクティブな月が表示されます。

SQLFiddle を作成し、使いやすいようにテーブル名をサブスクリプションに変更しました。

http://sqlfiddle.com/#!2/6b2f2/14

于 2013-09-18T20:16:02.017 に答える