前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大数据面试SQL045-每个用户每月访问次数占比及累积占比

大数据面试SQL045-每个用户每月访问次数占比及累积占比

作者头像
数据仓库晨曦
发布2024-03-25 15:52:56
1680
发布2024-03-25 15:52:56
举报
文章被收录于专栏:数据仓库技术

接上一道题目大数据面试SQL044-统计每个用户累计访问次数我们再进一步探查sum()聚合函数使用over()开窗后有order by和没有order by的区别。

一、题目

有如下用户访问数据t_visit_stat_044,包含用户ID(user_id),访问日期(visit_date),当天访问次数(visit_cnt)

要求使用SQL统计出每个用户每月访问次数与其访问总次数的占比以及其累积到每个月访问次数总与其访问总次数的占比

代码语言:javascript
复制
--样例数据
+----------+-------------+------------+
| user_id  | visit_date  | visit_cnt  |
+----------+-------------+------------+
| u001     | 2024-01-01  | 3          |
| u001     | 2024-01-02  | 4          |
| u002     | 2024-01-03  | 6          |
| u003     | 2024-01-07  | 2          |
| u001     | 2024-02-04  | 5          |
| u002     | 2024-02-10  | 3          |
| u002     | 2024-02-13  | 1          |
| u002     | 2024-02-14  | 7          |
| u003     | 2024-02-11  | 2          |
+----------+-------------+------------+
--期望结果
+----------+----------+----------------------+----------------------+
| user_id  |  month   |   month_visit_per    |   total_visit_per    |
+----------+----------+----------------------+----------------------+
| u001     | 2024-01  | 0.5833333333333334   | 0.5833333333333334   |
| u001     | 2024-02  | 0.4166666666666667   | 1.0                  |
| u002     | 2024-01  | 0.35294117647058826  | 0.35294117647058826  |
| u002     | 2024-02  | 0.6470588235294118   | 1.0                  |
| u003     | 2024-01  | 0.5                  | 0.5                  |
| u003     | 2024-02  | 0.5                  | 1.0                  |
+----------+----------+----------------------+----------------------+

二、分析

上一个题目,我们统计出了每个月的访问次数,以及到当月的累积次数。

想要实现每个用户本月访问次数占总访问次数的比例,需要计算出每个用户的访问总次数;想要计算出累积访问次数占总访问次数比例,也需要计算出每个用户的访问总次数;但是这里有个问题,需要将sum()的结果放到每一行,所以我们依旧需要使用开窗。

维度

评分

题目难度

⭐️⭐️⭐️⭐️

题目清晰度

⭐️⭐️⭐️⭐️⭐

业务常见度

⭐️⭐️⭐️⭐️

三、SQL

1)上一篇中查询累积访问次数的查询语句和结果

代码语言:javascript
复制
select
    user_id,
    month,
    month_visit,
    sum(month_visit)over(partition by user_id order by month asc) as total_count
from (select
          user_id,
          substr(visit_date, 0, 7) as month,
          sum(visit_cnt)           as month_visit
      from t_visit_stat_044
      group by user_id, substr(visit_date, 0, 7)
      ) t

查询结果

2)在上面结果上,我们增加一列数据,对每个用户所有月份的访问次数和: total_month_count 。这里需要注意聚合函数sum()后面over()内的写法差别,计算累积求和时有order by 语句,计算全部访问次数时没有。

代码语言:javascript
复制
select
    user_id,
    month,
    month_visit,
    sum(month_visit)over(partition by user_id order by month asc) as total_count,
    sum(month_visit)over(partition by user_id) as total_all_count
from (select
          user_id,
          substr(visit_date, 0, 7) as month,
          sum(visit_cnt)           as month_visit
      from t_visit_stat_044
      group by user_id, substr(visit_date, 0, 7)
      ) t

查询结果

  1. 查询最后结果,需要将month_visit/total_all_count即为每个用户每月访问次数占其总次数的比例,total_count/total_all_count即为累积访问次数占比
代码语言:javascript
复制
select
    user_id,
    month,
    month_visit/sum(month_visit)over(partition by user_id) as month_visit_per,
    sum(month_visit)over(partition by user_id order by month asc)/sum(month_visit)over(partition by user_id) as total_visit_per
from (select
          user_id,
          substr(visit_date, 0, 7) as month,
          sum(visit_cnt)           as month_visit
      from t_visit_stat_044
      group by user_id, substr(visit_date, 0, 7)
      ) t

查询结果

说明: 聚合函数包括 sum()、count()、avg() 等,均可以使用over() 对其开窗。其中在over()函数内,如果存在order by 语句,则是计算从分组内的第一个数据累积到当前行数据的聚合结果,如果没有order by语句,则计算整个分组内的聚合结果。

四、建表语句和数据插入

代码语言:javascript
复制
--建表语句
create table if not exists t_visit_stat_044
  (
    user_id string,
    visit_date string,
    visit_cnt bigint
  )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS orc;
--数据插入语句
insert into table t_visit_stat_044 values
('u001','2024-01-01',3),
('u001','2024-01-02',4),
('u002','2024-01-03',6),
('u003','2024-01-07',2),
('u001','2024-02-04',5),
('u002','2024-02-10',3),
('u002','2024-02-13',1),
('u002','2024-02-14',7),
('u003','2024-02-11',2);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目
  • 二、分析
  • 三、SQL
  • 四、建表语句和数据插入
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档