0

假设我在同一个 MySQL DB 中有两个表:

第一个是 inbound_campaign_visit 表。它看起来像这样。

+----+------------+------------------+------------- --------+
| 编号 | 用户 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 |
+----+------------+------------------+------------- --------+

每次用户通过点击促销活动访问我的网站时,都会在此表上生成一行。“日期”列代表他们来到该站点的时间。

第二张表是我的交易表。

+--------+---------+---------+
| 编号 | 用户 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,因为它们不符合规则 1。还要注意事务 321641 如何仅适用于 inbound_campaign 2 而不是 inbound_campaign 1(即使两个活动都在规则 1 中定义的 30 天限制范围内)。

我已经为此苦苦挣扎了一段时间,因此将不胜感激。当然我可以在代码中做到这一点,但必须有一种方法可以在 SQL 中做到这一点。TIA。

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 回答