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

Gra*_*ant 6 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
Run Code Online (Sandbox Code Playgroud)

我想得到以下内容:

  1. 计数cid为uniqVisits
  2. 计数的cidHAVING(计数<= 1)作为弹
  3. 按月分组

我想从Cookie ID(cid)获得每月的跳出率.

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

期望的结果:

uniqVisits | bounced | month
-----------|---------|-------
2345       | 325     | 2015-10
-----------|---------|-------
7345       | 734     | 2015-11
-----------|---------|-------
3982       | 823     | 2015-12
-----------|---------|-------
4291       | 639     | 2016-01
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多方法,下面是我能得到的最接近但是它给了我错误:"操作数应该包含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
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句:我也尝试了以下查询,但它超时,然后抛出服务器错误:它也没有将第二个查询分组到月份,显然是因为"cid有计数<= 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
Run Code Online (Sandbox Code Playgroud)

Gra*_*ant 1

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

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
Run Code Online (Sandbox Code Playgroud)

给我:

uniqVisitors | bounced | month  
---------------------------------
7237    6822    2015-10
12597   12136   2015-11
12980   12573   2015-12
12091   11695   2016-01
5396    5134    2016-02
Run Code Online (Sandbox Code Playgroud)