我有一个LOGGED_LOG表,该表有USERNAME、LOGIN_TIME和LOGOUT_TIME列. 我需要计算每天的登录用户.
表 struct :
column name | type |
---|---|
username | varchar(32) |
login_time | datetime |
logout_time | datetime nullable |
样本数据:
username | login_time | logout_time |
---|---|---|
ddd | 2023-01-05 23:10:00 | null |
aaa | 2023-01-06 23:10:00 | 2023-01-06 23:59:00 |
bbb | 2023-01-06 23:35:00 | 2023-01-07 03:00:00 |
ccc | 2023-01-07 13:35:00 | 2023-01-07 14:00:00 |
ccc | 2023-01-07 18:35:00 | 2023-01-07 19:00:00 |
aaa | 2023-01-08 13:35:00 | 2023-01-09 14:00:00 |
bbb | 2023-01-09 13:35:00 | null |
ccc | 2023-01-09 14:35:00 | 2023-01-10 14:00:00 |
aaa | 2023-01-10 13:35:00 | null |
预期结果:
date | total |
---|---|
2023-01-05 | 1 |
2023-01-06 | 3 |
2023-01-07 | 3 |
2023-01-08 | 2 |
2023-01-09 | 4 |
2023-01-10 | 4 |
我try 用用例替换LOGGED_LOG部分的空注销, 然后在DATE_PERIOD部分创建日列表的临时表, 但在入表获取结果时,只有首日和所有天数的用户.
SELECT
daily_logged_log.date, count( daily_logged_log.username )
FROM (
SELECT
date_period.date, logged_log.username
FROM (
SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as date
FROM (SELECT 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (SELECT 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (SELECT 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
cross join (SELECT 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) as date_period
LEFT JOIN (
SELECT
username,
DATE( login_time ) as login_at,
CASE
WHEN logout_time IS NULL
THEN DATE( NOW() )
ELSE DATE( logout_time )
END
as logout_at
FROM logged_log
WHERE DATE( login_time ) <= '2023-01-09'
AND CASE
WHEN logout_time IS NULL
THEN DATE( NOW() )
ELSE DATE( logout_time )
END >= '2023-01-07'
) as logged_log
ON date_period.date BETWEEN logged_log.login_at AND logged_log.logout_at
WHERE date_period.date BETWEEN '2023-01-07' AND '2023-01-09'
GROUP BY date_period.date, logged_log.username
) as daily_logged_log