在过去n个月内未登录的用户

时间:2016-06-29 09:27:02

标签: mysql

我想删除在指定时间段内没有登录的用户,但稍后会根据结果选择一段时间。

所以我需要一份报告,其中我将收到许多用户,这些用户在过去1个月,2个月...... n个月内没有登录。

我不太清楚如何在单个mysql查询中实现移动时段。

在给定时期内提取这些用户非常简单:

SELECT count(distinct id) from tmp_last_login 
WHERE last_login <= DATE_SUB(now(), interval 1 month)

但是如何在n个月内实现这样的报告呢?

预期结果:

**interval**    **cnt**
1                 xxx
2                 xxx
3                 xxx
4                 xxx
5                 xxx
...               xxx
n                 xxx

2 个答案:

答案 0 :(得分:4)

以下查询将在distinct ids的时间间隔内为each month difference返回10 months from now的计数。

SELECT
12 * (YEAR(CURDATE()) - YEAR(last_login)) + (MONTH(CURDATE()) - MONTH(last_login)) AS months,
count(DISTINCT id) cnt
FROM
    tmp_last_login
WHERE   last_login >= DATE_SUB(CURDATE(),   INTERVAL 10 MONTH)
GROUP BY months;

您也可以使用PERIOD_DIFF功能。

SELECT
PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m'),DATE_FORMAT(last_login,'%Y%m')) AS months,
count(DISTINCT id) cnt
FROM
    tmp_last_login
WHERE   last_login >= DATE_SUB(CURDATE(),   INTERVAL 10 MONTH)
GROUP BY months;

注意:

如果您有同一个用户的多个last_login条目,则需要为每个用户找到maximum last login个时间,然后做其余的事。

SELECT
PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m'),DATE_FORMAT(t.max_last_login,'%Y%m')) AS months,
count(t.id) cnt
FROM
    (
            SELECT 
                id,
                MAX(last_login) max_last_login
            FROM tmp_last_login
            GROUP BY id
        ) AS t
WHERE   t.max_last_login >= DATE_SUB(CURDATE(),   INTERVAL 10 MONTH)
GROUP BY months;

SQL FIDDLE DEMO

答案 1 :(得分:1)

尝试:

SELECT 
    id, 
    ((last_login - UNIX_TIMESTAMP()) / 2629743) monthsSinceLastLogin
FROM tmp_last_login
WHERE last_login - UNIX_TIMESTAMP() > 2629743
GROUP BY id
HAVING max(last_login) = last_login

假设:您正在使用以秒为单位计算的unix时间戳。 2629743是约。一个月之后。

使用GROUP BY和HAVING部分,您确保只选择最新的登录信息。 使用WHERE部分,您可以确保仅粉色至少一个月的记录。