SQL VQ1 统计自然周平均登录次数情况

SQL VQ1 统计自然周平均登录次数情况

题目 : 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 , 周日: 6
  • date_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
  1. 把每周时间内的时间全部改成每周一
select uid,
    date_sub(login_date, interval weekday(login_date) day) as week_begin
from user_login_tb
  1. 统计每周的总人数 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;

猜你喜欢

转载自blog.csdn.net/qq_44226094/article/details/130018748
今日推荐