SELECT
t1.min_time AS dt,
ROUND(COUNT(t2.uid) / COUNT(t1.uid), 2) AS sec_cnt
FROM(
SELECT
uid,
MIN(DATE(in_time)) min_time
FROM tb_user_log
GROUP BY uid
) t1
LEFT JOIN(
SELECT uid, DATE(in_time) yestday FROM tb_user_log
UNION
SELECT uid, DATE(out_time) yestday FROM tb_user_log
) t2
ON t1.uid = t2.uid AND DATEDIFF(t2.yestday, DATE(t1.min_time)) = 1
WHERE month(min_time) = 11
GROUP BY dt
有两个要点
第一:通过UNION把in_time和out_time的纪录纵向拼在一起,并过滤相同的记录,如此一来就可以通过DATEDIFF函数筛选出与第一次登陆时间(使用MIN(DATE(in_time))查询得到)之间相差正好一天的记录。
第二:DATEDIFF(t2.yestday, DATE(t1.min_time)) = 1这一条件必须放在链接条件中,这样一来经过左连接,右表中不符合该条件的记录,t2.uid值将为NULL。在此基础上通过COUNT函数就能轻松得到第一天和第二天登录的人数(COUNT函数对NULL值自动跳过)。相反如果把这一条件放在WHERE中,则所有不符合该条件的记录将被直接过滤掉,就难以区分出第一、二天登录的人数。

京公网安备 11010502036488号