SQL - 根据日期计算重新发生的记录

时间:2015-09-21 20:49:40

标签: mysql sql

我有一个名为id的表,只有2列:login_date为VarChar,+-------+------------+ | id | login_date | +-------+------------+ | user1 | 2014-10-15 | | user1 | 2014-10-15 | | user2 | 2014-10-15 | | user3 | 2014-10-15 | | user1 | 2014-10-16 | | user3 | 2014-10-16 | | user4 | 2014-10-16 | | user2 | 2014-10-17 | | user4 | 2014-10-17 | +-------+------------+ 为Date。这是一个小样本:

+------------+--------------+
| Date       | NextDayLogin |
+------------+--------------+
| 2014-10-15 | 2            |
| 2014-10-16 | 1            |
| 2014-10-17 | 0            |
+------------+--------------+

我想编写一个SQL查询,每天显示第二天登录的用户数。例如,10月15日有3个独特的登录 - 其中3个,只有2个用户已于10月16日登录。输出应该是这样的:

SELECT 
    DISTINCT(id),
    DATE(login_date) as 'Dates' 
FROM LoginTable t1
INNER JOIN (
    SELECT 
        DISTINCT(id) as id2, 
        DATE(login_date) as 'DatesNew' 
    FROM LoginTable 
    WHERE 'DatesNew' = DATE(t1.login_date) + INTERVAL '1' DAY
) t2
ON DATE(t1.login_date) = t2.DatesNew 
AND t1.id = t2.id2

我最好的尝试(理论上)是:

Unknown column t1.log_date in where clause

但是,我收到错误:ID| VAL | LOG | DATE 1 1 bla xx/xx/xxxx 2 2 bla xx/xx/xxxx 3 3 bla xx/xx/xxxx 4 1 bla xx/xx/xxxx 5 6 bla xx/xx/xxxx 6 2 bla xx/xx/xxxx 怎么能实现这一目标?如果这很重要,我正在使用MySQL。

3 个答案:

答案 0 :(得分:1)

您可以在表格上left join使用指定的+1日期来获得所需的计数。

Fiddle with sample data

select t1.login_date, count(distinct t2.id) as nextdaylogin
from t t1
left join t t2 on t1.login_date = t2.login_date-1 and t1.id = t2.id
group by t1.login_date

答案 1 :(得分:0)

只需设置一个名为consecutive_days

的新列即可

然后,每次用户登录时,只需针对curr_date(您也可以创建的列)测试last_login_datetime,如果时间间隔少于24小时,请设置consecutive_days = consecutive_days +1;

如果不是,则设为等于0。

答案 2 :(得分:0)

一种方法是使用相关子查询:

select date(login_date), count(*) as NumOnDay,
       (select count(*)
        from LoginTable lt2
        where lt2.login_date >= date_add(date(lt.login_date), interval 1 day) and
              lt2.login_date < date_add(date(lt.login_date), interval 2 day)
       ) as NumNextDay
from LoginTable lt
group by date(login_date)
order by date(login_date);

您的尝试甚至没有count(),所以我不确定您是如何考虑计算的。