0

同じ MySQL DB に 2 つのテーブルがあるとします。

1 つ目は inbound_campaign_visit テーブルです。このように見えます。

+----+-----------------------+------------------+------------- ------+
| | ID | ユーザー ID | インバウンドキャンペーン | 日付 |
+----+-----------------------+------------------+------------- ------+
| | 1 | 1 | 1 | 2013-02-18 13:00:00 |
| | 2 | 1 | 2 | 2013-02-24 13:00:00 |
| | 3 | 2 | 3 | 2013-01-01 01:00:00 |
| | 4 | 2 | 2 | 2013-02-24 19:00:00 |
+----+-----------------------+------------------+------------- ------+

ユーザーがプロモーション キャンペーンをクリックしてサイトにアクセスするたびに、このテーブルの行が生成されます。「日付」列は、サイトにアクセスした時刻を表します。

2 番目のテーブルは私のトランザクション テーブルです。

+--------+---------------------+---------------------+
| | ID | ユーザー ID | 作成日 |
+--------+---------------------+---------------------+
| | 321639 | 1 | 2013-02-18 14:00:00 |
| | 321640 | 1 | 2013-02-24 15:00:00 |
| | 321641 | 1 | 2013-02-25 13:00:00 |
| | 321642 | 1 | 2013-04-05 12:00:00 |
| | 321643 | 2 | 2013-01-01 12:00:00 |
| | 321644 | 2 | 2013-02-23 12:00:00 |
+--------+---------------------+---------------------+

このテーブルの行は、トランザクションが発生するたびに作成されます。「creation_date」列は、トランザクションが発生した時刻を表します。

インバウンド キャンペーンごとのトランザクション数をカウントするレポートを作成したいと考えています。次の規則を適用する必要があります。

  1. user_id 値がトランザクションの値と一致し、inbound_campaign_visit 行が作成されてから 30 日以内にトランザクションが発生した場合、トランザクションはインバウンド キャンペーンに関連していると見なされます。
  2. トランザクションは、特定のユーザーの最新のインバウンド Campaign_visit にのみ適用できます。

結果テーブルは次のようになります。

+------------------+----------------------------------+
| | インバウンドキャンペーン | トランザクション数 |
+------------------+----------------------------------+
| | 1 | 1 |
| | 2 | 2 |
| | 3 | 1 |
+------------------+----------------------------------+

トランザクション 321644 と 321642 はルール 1 に違反しているため、カウントされないことに注意してください。また、トランザクション 321641 が inbound_campaign 2 にのみ適用され、inbound_campaign 1 には適用されないことにも注意してください (両方のキャンペーンがルール 1 で定義された 30 日間の制限内にあるにもかかわらず)。

私はしばらくの間これに苦労してきましたので、どんな助けもいただければ幸いです。もちろん、コードでこれを行うこともできますが、SQL でこれを行う方法が必要です。ティア。

4

1 に答える 1

0
SELECT  a.inbound_campaign,
        COUNT(b.user_ID) TotalCount
FROM    inbound_campaign_visit a
        LEFT JOIN transaction b
            ON a.user_ID = b.user_ID AND
               DATEDIFF(CURDATE(), b.creation_date) > 30
GROUP   BY a.inbound_campaign
于 2013-03-21T00:26:45.863 に答える