COUNT DISTINCT + COUNT GROUP BY HAVING(value)+ GROUP BY月

时间:2016-02-14 09:41:23

标签: mysql

我有一个包含列的表:cid,date

示例表数据:注意:cid包含字符串值,例如:'otsytb8o7sbs50w9doghwzvfy0vb8f9h'很多都是重复的。

 cid. date  
--------------------------------------------------------
1   2015-10-10 04:57:57
2   2015-10-10 05:03:58
3   2015-10-10 05:24:49
4   2015-10-10 05:28:24
5   2015-10-10 05:28:26
6   2015-10-10 05:28:40
7   2015-10-10 05:30:39
8   2015-10-10 05:33:04
9   2015-10-10 05:35:42
9   2015-10-10 05:36:03

我想得到以下内容:

  1. 不同的cid计数为uniqVisits
  2. cid已计数(计数< = 1)的计数
  3. 按月分组
  4. 我想从Cookie ID(cid)获得每月的跳出率。

    所以我正在寻找:(反复计算< = 1的COUNT个唯一Cookie ID),以及针对总独立访问者的(COUNT DISTINCT cid),按月分组

    期望的结果:

    uniqVisits | bounced | month
    -----------|---------|-------
    2345       | 325     | 2015-10
    -----------|---------|-------
    7345       | 734     | 2015-11
    -----------|---------|-------
    3982       | 823     | 2015-12
    -----------|---------|-------
    4291       | 639     | 2016-01
    

    我尝试了很多方法,下面是我能得到的最接近的方法,但它给了我错误:“操作数应该包含1列”

    SELECT count(*) AS bounced,
    ( SELECT count( DISTINCT(cid) ) AS uniqVisits,
        SUBSTR(DATE(date),1,7) AS month
        FROM table ) AS uniqVisits
    FROM (
       SELECT COUNT(cid) AS bounced,
       SUBSTR(DATE(date),1,7) AS month
       FROM table
       GROUP BY cid
       HAVING (count <= 1)
    ) AS x
    GROUP BY month
    

    如何编写此查询以在上面所示的“所需结果:”图表/表格中为我提供所需的结果?

    顺便说一句:我也尝试了以下查询,但它超时,然后抛出服务器错误:它也没有将第二个查询分组到月份,显然是因为“cid有计数&lt; = 1”

    SELECT c1.uniqVisits,
            c1.month,
            c2.bounced
        FROM ( SELECT COUNT(DISTINCT t1.cid)    AS `uniqVisits`,
    SUBSTR(DATE(t1.date),1,7) AS `month`
    FROM table t1
    GROUP BY month
            ) c1
        JOIN ( SELECT COUNT(*)         AS `bounced`,
    SUBSTR(DATE(t2.date),1,7) AS `month`
    FROM table t2
    GROUP BY month, cid HAVING (count <= 1)
            ) c2
        ON c2.month = c1.month
        ORDER BY c1.month
    

1 个答案:

答案 0 :(得分:0)

所以我已经解决了这个问题:

SELECT uniqVisitors, COUNT(*) AS bounced, T1.month
FROM (
    SELECT cid,
    SUBSTR(DATE(date),1,7) AS month
    FROM table
    GROUP BY cid
    HAVING COUNT(*) <= 1
) T1
LEFT JOIN
( SELECT count( DISTINCT(cid) ) AS uniqVisitors,
    SUBSTR(DATE(date),1,7) AS month
    FROM table
    GROUP By month ) T2
ON T1.month = T2.month
GROUP BY month

给我:

uniqVisitors | bounced | month  
---------------------------------
7237    6822    2015-10
12597   12136   2015-11
12980   12573   2015-12
12091   11695   2016-01
5396    5134    2016-02