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
SECONDMINUTE_MICROSECOND
MINUTE分钟MINUTE_SECOND
HOUR小时HOUR_MICROSECOND
DAYHOUR_SECOND
WEEKHOUR_MINUTE
MONTHDAY_MICROSECOND
QUARTER季度DAY_SECOND
YEARDAY_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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值