【问题标题】:MySQL JOIN for Cohort Analysis用于队列分析的 MySQL JOIN
【发布时间】:2013-01-01 16:04:39
【问题描述】:

我有两个表可以使用,USERS,METRICS_DAILY

mysql> 描述用户;

+---------------------------+---------------------+------+-----+------------------------------------------+----------------+
    | Field                     | Type                | Null | Key | Default                                  | Extra          |
    +---------------------------+---------------------+------+-----+------------------------------------------+----------------+
    | USER_ID                   | int(11) unsigned    | NO   | PRI | NULL                                     | auto_increment |
    | CREATED                   | timestamp           | NO   |     | CURRENT_TIMESTAMP|
+---------------------------+---------------------+------+-----+------------------------------------------+----------------+

mysql> 描述 METRICS_DAILY;

+---------+----------------------+------+-----+---------+-------+
| Field   | Type                 | Null | Key | Default | Extra |
+---------+----------------------+------+-----+---------+-------+
| USER_ID | int(11) unsigned     | NO   | PRI | NULL    |       |
| EVENT   | tinyint(3) unsigned  | NO   | PRI | NULL    |       |
| DATE    | date                 | NO   | PRI | NULL    |       |
| COUNT   | smallint(5) unsigned | NO   |     | 0       |       |
+---------+----------------------+------+-----+---------+-------+

我需要选择 count distinct USER_ID 其中 DATE=DATE(NOW()) 和 (x,y,z) 中的 EVENT 和 USERS.CREATED 是 month1,month2,month3,...monthCURRENT。

我几乎可以完全在 METRICS_DAILY 表中完成它,因为我的 DATE 对应于 USERS.CREATED,只是间接地。

Created 是一个完整的时间戳。我需要按月将其分解为同类群组。

这是一个开始:

SELECT count(distinct METRICS_DAILY.USER_ID),CREATED,MONTH(CREATED),DATE FROM METRICS_DAILY LEFT JOIN USERS ON (METRICS_DAILY.USER_ID = USERS.USER_ID) where EVENT > 10 and DATE=DATE(NOW()) group by月(已创建);

+---------------------------------------+---------------------+----------------+------------+
| count(distinct METRICS_DAILY.USER_ID) | CREATED             | MONTH(CREATED) | DATE       |
+---------------------------------------+---------------------+----------------+------------+
|                                     3 | 2013-01-14 09:35:16 |              1 | 2013-01-18 |
|                                    16 | 2012-12-15 07:07:49 |             12 | 2013-01-18 |
+---------------------------------------+---------------------+----------------+------------+

集合中的 2 行(0.00 秒)

【问题讨论】:

  • 所以,这种好像是两个问题,真的应该分开问。第一个是如何进行 JOIN(这不是很清楚),另一个是如何将 CREATED 从完整的时间戳更改为月份的 bin。我明白你的要求了吗?

标签: mysql sql


【解决方案1】:

这样的?

SELECT MONTHNAME(u.CREATED), YEAR(u.CREATED), COUNT(*) AS UserCount
FROM METRICS_DAILY md
JOIN USERS u
ON u.USER_ID = md.USER_ID
WHERE md.DATE = NOW() AND md.EVENT in (x,y,z)
GROUP BY MONTHNAME(u.CREATED), YEAR(u.CREATED)

【讨论】:

    【解决方案2】:
    SELECT DATE(`METRICS_DAILY`.`DATE`) AS `Day of DATE`, `METRICS_DAILY`.`EVENT` AS `EVENT`, COUNT(DISTINCT `METRICS_DAILY`.`USER_ID`) AS `Number of unique User Id`
      FROM METRICS_DAILY
      JOIN USERS ON `METRICS_DAILY`.`USER_ID` = `USERS`.`USER_ID`
      WHERE (`METRICS_DAILY`.`EVENT` >= "31") AND (`METRICS_DAILY`.`DATE` BETWEEN "2012-12-01" AND "2012-12-31") AND (`USERS`.`CREATED` BETWEEN CAST("2012-12-01" AS DATETIME) AND CAST(CONCAT("2012-12-31", " 23:59:59") AS DATETIME))
      GROUP BY DATE(`METRICS_DAILY`.`DATE`), `METRICS_DAILY`.`EVENT`
      ORDER BY `Day of DATE` ASC, `EVENT` ASC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多