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 BY
3 月にサブスクライバーだった人が 4 月にサブスクライブを解除し、6 月に再サブスクライブした可能性があるため、私はこれを行うことはできません。12 個のクエリを実行できると思いUNION
ますが、もう少しエレガントなものを期待していました。
いくつかの制限パラメーター: データベースへのアクセスは読み取り専用です。テーブル構造を変更したり、一時テーブルを作成したりすることはできません。これは MySQL でのみ行う必要があります。CRM の仕組みが原因で、Python や PHP を使用して結果を操作することはできません。どんな助けでも大歓迎です!これをうまく説明していない場合はお知らせください。ありがとう!