题目 : https://www.nowcoder.com/practice/4655e5dfa8f64166875d6f77558a1fc8?tpId=350
数据
drop table if exists user_login_tb;
CREATE TABLE `user_login_tb` (
`id` int PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
`uid` int NOT NULL COMMENT '用户ID',
`login_date` date COMMENT '登录日期'
);
insert into user_login_tb(uid, login_date) values
(1, '2022-08-08'),
(1, '2022-08-11'),
(2, '2022-08-11'),
(2, '2022-08-11'),
(1, '2022-08-13'),
(1, '2022-08-15'),
(2, '2022-08-15'),
(2, '2022-08-16'),
(2, '2022-08-17'),
(2, '2022-08-18'),
(2, '2022-08-19'),
(2, '2022-09-04');
需求
计算每个自然周内(周一到周日算一个自然周)所有用户的平均登录次数,用户可能在一天内登录多次
- 结果按每一周的周一升序排序,平均次数保留两位小数
查询结果 :
week_begin|avg_times
2022-08-08|2.50
2022-08-15|3.00
2022-08-29|1.00
解决
技术点 :
weekday
: 计算日期是每周中的第几天 , 如 : 周一 : 0 , 周日: 6date_sub
: 对日期 - 指定的时间间隔 , 返回日期
date_sub(date, interval expr type)
type 类型 :
MICROSECOND | 微秒 | SECOND_MICROSECOND |
---|---|---|
SECOND | 秒 | MINUTE_MICROSECOND |
MINUTE | 分钟 | MINUTE_SECOND |
HOUR | 小时 | HOUR_MICROSECOND |
DAY | 天 | HOUR_SECOND |
WEEK | 周 | HOUR_MINUTE |
MONTH | 月 | DAY_MICROSECOND |
QUARTER | 季度 | DAY_SECOND |
YEAR | 年 | DAY_MINUTE |
DAY_HOUR | ||
YEAR_MONTH |
- 把每周时间内的时间全部改成每周一
select uid,
date_sub(login_date, interval weekday(login_date) day) as week_begin
from user_login_tb
- 统计每周的总人数
count(distinct uid)
- 统计每周的登录数 :
count(*)
with t1 as (
select uid,
date_sub(login_date, interval weekday(login_date) day) as week_begin
from user_login_tb
)
select week_begin,
round(count(*)/ count(distinct uid), 2) as avg_times
from t1
group by week_begin
order by week_begin;