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

大数据面试SQL044-统计每个用户累计访问次数

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

一、题目

有如下用户访问数据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  | total_count  |
+----------+----------+--------------+--------------+
| u001     | 2024-01  | 7            | 7            |
| u001     | 2024-02  | 5            | 12           |
| u002     | 2024-01  | 6            | 6            |
| u002     | 2024-02  | 11           | 17           |
| u003     | 2024-01  | 2            | 2            |
| u003     | 2024-02  | 2            | 4            |
+----------+----------+--------------+--------------+

二、分析

题目要考察的内容分为两部分,统计每个用户每月访问次数,这个分组使用聚合函数sum()即可完成,即题目中的小计部分。第二部分为计算每个用户截止到当前月份的累积访问次数。这是考察聚合函数经过over开窗后,使用order by 进行排序和不使用排序结果的差异。不使用order by计算的是整个分组下的聚合结果;使用order by 则是计算分组内截止到当前行的数据。

维度

评分

题目难度

⭐️⭐️⭐️⭐️

题目清晰度

⭐️⭐️⭐️⭐️⭐

业务常见度

⭐️⭐️⭐️⭐️

三、SQL

1)因为题目给出的是每天的统计结果,目标结果为每个月数据。我们第一步使用聚合函数sum()计算每月每个用户的访问次数。这里为了结果方便查看,在最后增加了order by 语句。

代码语言:javascript
复制
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)
order by 1,2

查询结果

2)对上述结果,再次使用聚合函数sum()但是对其进行开窗按照用户分组,按照月份排序。

代码语言: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

查询结果

四、建表语句和数据插入

代码语言: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-10,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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