我有一个名为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。
答案 0 :(得分:1)
您可以在表格上left join
使用指定的+1日期来获得所需的计数。
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()
,所以我不确定您是如何考虑计算的。