统计每个url访问的topN用户以及访问次数(sql)
一、题目如下
有一张表t1,假设有以下三个字段,代表某个userid在某一天访问了这个url:
userid url event_day
q1:20210725这一天每个url的pv/uv
q2: 20210725这一天每个url访问的top10客户以及访问次数
输出:url, userid,pv,排名
q3: 20210725这一天的7日留存
表如下:
1.对于问题1
pv:每个url的总访问量 uv:每个url的访问用户量
pv:
SELECT COUNT(*), url
FROM user_url
where event_day = '2021-07-25'
GROUP BY url
uv:
SELECT COUNT(DISTINCT userid) as userCount, url
FROM user_url
where event_day = '2021-07-25'
GROUP BY url
2.对于问题2
难点在于两处:
1.如果弄出每个ur的每个客户访问次数
2.提取出前10访问量
对于难点一:
我们采用Group By A,B两个字段一起分组。我们对用户和url一起分组,然后计算条数就知道每个用户的每个url访问次数
SELECT count(*) as countUrl, userid, url
FROM `user_url`
where event_day = '2021-07-25'
GROUP BY userid, url
对于难点二:
怎么提取出每个url的客户方面量的前10。 因为例子有限,所以提取出前1。
SELECT * from (
SELECT count(*) as countUrl, userid, url
FROM `user_url`
where event_day = '2021-07-25'
GROUP BY userid, url
) as t1
where 1 >(
SELECT COUNT(*) FROM(
SELECT count(*) as countUrl, userid, url
FROM `user_url`
where event_day = '2021-07-25'
GROUP BY userid, url
)as t2
where t1.url = t2.url
AND t1.countUrl < t2.countUrl
)
解释下:
其中两个表已经用了t1.url = t2.url连接,因此用C来举例。
一定要明显那个是主表,那个是副表。t1是主表,t2是副表。因此t1的每个数据去和t2的所有数据对比。才会有下图的解释。 当t1取不同值的时候,去与t2比较,看满足条件的条数有多少,就可以找到排序前n的问题(不用OrderBy找排序)
所以就出来了。 把每组的前n的提取出来。 主要思路是采用主表与副表的比较,看比较出来的条数,就可以确定排名。
还有一个更简单的方法,利用Parition By 与窗口函数结合。
SELECT r2.userid, r2.url, r2.countUrl
FROM
(
SELECT r1.userid, r1.url,r1.countUrl,
DENSE_RANK() OVER (PARTITION BY url ORDER BY countUrl DESC) rankURL
FROM(
SELECT count(*) as countUrl, userid, url
FROM `user_url`
where event_day = '2021-07-25'
GROUP BY userid, url
) as r1
)as r2
WHERE r2.rankURL < 2
可能一大段下来有些不好消耗,我们一段一段来,默认我们每个url的每个用户访问量都已知哈
先来这段:
SELECT r1.userid, r1.url,r1.countUrl,
DENSE_RANK() OVER (PARTITION BY url ORDER BY countUrl DESC) rankURL
FROM(
SELECT count(*) as countUrl, userid, url
FROM `user_url`
where event_day = '2021-07-25'
GROUP BY userid, url
) as r1
其中的PARITION BY URL 非常有用,对每组进行分开(可以保留下每组的数据) ,group by 只能提取出聚合后的数据(只有一条)。
PARITION BY 与RANK()系列的函数函数堪称绝配!!!直接在分组里进行统计前几名,然后在通过这个排序的序号进行筛选。
窗口函数有如下三种,分别排序形式:
RANK(): 1,1,1,4
DENSE_RANK():1,1,1,2
ROW_NUMBER():1,2,3,4
这里就根据自己的情况来选择排序序号了
我题目中选择的第二种,因为对于不同URL没有存在相同的,因此没有显示出效果。
然后把最大的晒出来, rankURL<2的
SELECT r2.userid, r2.url, r2.countUrl
FROM
(
SELECT r1.userid, r1.url,r1.countUrl,
DENSE_RANK() OVER (PARTITION BY url ORDER BY countUrl DESC) rankURL
FROM(
SELECT count(*) as countUrl, userid, url
FROM `user_url`
where event_day = '2021-07-25'
GROUP BY userid, url
) as r1
)as r2
WHERE r2.rankURL < 2
这样就把排名最前的筛选出来了。
3.对于问题3
select DISTINCT userid
from user_url
where event_day >= '2021-07-18'
AND event_day <= '2021-07-25'
统计每个url访问的topN用户以及访问次数(sql)相关推荐
- 使用FTP协议的服务,包括匿名用户验证访问,用户验证访问,虚拟用户验证访问等
目录 1.FTP服务概述 2.在服务端安装vsftpd程序 3.基于匿名用户验证访问的 FTP 服务 4.测试匿名 FTP服务 5.基于用户验证访问的FTP服务 6.基于用户验证访问的FTP服务的测试 ...
- linux限制目录访问权限,linux用户的访问权限限制的方法都有哪些
如果你不希望自己的文件被人读取,又或者只是不想某个特定的用户读取修改文件,限制访问权限是最好的处理方法,下面小编就给大家介绍下Linux下限制用户访问权限的方法,一起来学习下吧. 现在需要限定某个用户 ...
- Django 用户登陆访问限制 @login_required
#用户登陆访问限制 from django.http import HttpResponseRedirect#只有登录了才能看到页面 #设置方法一:指定特定管理员才能访问 def main(reque ...
- 服务器禁止访问文件,服务器文件夹访问权限设置 控制访问权限方法
在企业局域网中,我们经常需要共享文件供局域网用户访问使用,但是为了保证共享文件的安全,我们也需要设置共享文件的访问权限,防止访问共享文件的用户越权访问共享文件的行为.那么,具体如何实现呢?可以通过以下 ...
- 如果20万用户同时访问一个热点缓存,如何优化你的缓存架构?
点击上方"蓝字", 右上角选择"设为星标" 周一至周五上午11点45!精品技术文章准时送上! 本文转载自公众号:石杉的架构笔记 目录 (1)为什么要用缓存集群 ...
- 20万用户同时访问一个热点Key,如何优化缓存架构?
来源:石杉的架构笔记(ID:shishan100) 这篇文章,咱们来聊聊热点缓存的架构优化问题.使用缓存集群的时候,最怕的就是热 Key.大 Value 这两种情况. 一.为什么要用缓存集群 啥叫热 ...
- 易宝典文章——怎样配置TMG能够使外部用户成功访问Outlook Anywhere?
易宝典:http://support.microsoft.com/kb/2580470/zh-cn 在企业中通常部署Exchange Server 2010服务器都是使用内部网络环境进行的.用户在企业 ...
- hive 常用数据分析指标 - 网页访问数据指标 - 用户活跃度指标 - 付费行为指标
文章目录 一.网页访问数据指标 1. UV (UniqueVisitor)独立访客 2. PV(Page View)网页浏览量 3.(Internet Protocol)独立IP 4. BR(Boun ...
- 运维之道 | Samba 文件共享传输服务(匿名用户访问、指定用户访问、共享账号映射访问)
前言 1.Samba 概述 Samba 最先在Linux和Windous两个平台之间架起一座桥梁,正式由于Samba的出现,我们可以在Linux系统和Windows系统之间互相通信,比如拷贝文件.实现 ...
- Citrix NetScaler Gateway:使用Smart Access实现根据源IP控制用户可访问的交付组
一.导语 NetScaler Smart Access是NetSacler Gateway的一个高级功能.如果用户是通过NetScaler(ADC)访问应用或桌面,该功能可以限制用户的应用或者桌面的可 ...
最新文章
- 如何成为一名优秀的创业公司CTO?
- yii required 字段去除*号
- 线程池ExcutorThreadPool的运行原理
- Leetcode 129. 求根到叶子节点数字之和 解题思路及C++实现
- buu 篱笆墙的影子
- 17商品推荐系统项目框架
- 如何理解CPU上下文切换(二)
- spring任务调度的使用
- docker安装微信
- 在线文本加密解密工具
- git 恢复被删除的文件
- 微信支付商户朋友圈广告
- 版权符号©的输入方法
- 基于冷冻电镜图像的低通滤波(Lowpass Filter)算法
- BLE(9)—— 细说 Advertising
- 小米文件管理android,小米文件管理器
- Vulcan 团队信息
- 谈谈如何设计秒杀服务
- 极豆科技加入飞桨技术伙伴计划,共筑智能网联汽车新生态
- Apriltag编解码系统
热门文章
- 基于SpringCloud Alibaba实现的论坛
- 个人博客升级改造ing
- oracle 2500varchar,Oracle中的varchar和varchar2有什么区别?
- 为什么训练时测试准确率大幅度波动_Nature Mach Intell|类药性预测准确率有极限...
- xml property标签注入一个类变量_依赖注入的学习
- java计算日期之间的天数_使用Java计算两个日期之间的天数
- c string erase_威刚推出SE770G移动固态硬盘:提供两年质保 附送双头USB-C
- 【UVA12230】Crossing Rivers(概率/期望)
- 如何找出当前占用磁盘io 最多的进程 - linux,如何找出当前占用磁盘IO最多的进程...
- Py2,Py3的差异