一、题目如下

有一张表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)相关推荐

  1. 使用FTP协议的服务,包括匿名用户验证访问,用户验证访问,虚拟用户验证访问等

    目录 1.FTP服务概述 2.在服务端安装vsftpd程序 3.基于匿名用户验证访问的 FTP 服务 4.测试匿名 FTP服务 5.基于用户验证访问的FTP服务 6.基于用户验证访问的FTP服务的测试 ...

  2. linux限制目录访问权限,linux用户的访问权限限制的方法都有哪些

    如果你不希望自己的文件被人读取,又或者只是不想某个特定的用户读取修改文件,限制访问权限是最好的处理方法,下面小编就给大家介绍下Linux下限制用户访问权限的方法,一起来学习下吧. 现在需要限定某个用户 ...

  3. Django 用户登陆访问限制 @login_required

    #用户登陆访问限制 from django.http import HttpResponseRedirect#只有登录了才能看到页面 #设置方法一:指定特定管理员才能访问 def main(reque ...

  4. 服务器禁止访问文件,服务器文件夹访问权限设置 控制访问权限方法

    在企业局域网中,我们经常需要共享文件供局域网用户访问使用,但是为了保证共享文件的安全,我们也需要设置共享文件的访问权限,防止访问共享文件的用户越权访问共享文件的行为.那么,具体如何实现呢?可以通过以下 ...

  5. 如果20万用户同时访问一个热点缓存,如何优化你的缓存架构?

    点击上方"蓝字", 右上角选择"设为星标" 周一至周五上午11点45!精品技术文章准时送上! 本文转载自公众号:石杉的架构笔记 目录 (1)为什么要用缓存集群 ...

  6. 20万用户同时访问一个热点Key,如何优化缓存架构?

    来源:石杉的架构笔记(ID:shishan100) 这篇文章,咱们来聊聊热点缓存的架构优化问题.使用缓存集群的时候,最怕的就是热 Key.大 Value 这两种情况. 一.为什么要用缓存集群 啥叫热 ...

  7. 易宝典文章——怎样配置TMG能够使外部用户成功访问Outlook Anywhere?

    易宝典:http://support.microsoft.com/kb/2580470/zh-cn 在企业中通常部署Exchange Server 2010服务器都是使用内部网络环境进行的.用户在企业 ...

  8. hive 常用数据分析指标 - 网页访问数据指标 - 用户活跃度指标 - 付费行为指标

    文章目录 一.网页访问数据指标 1. UV (UniqueVisitor)独立访客 2. PV(Page View)网页浏览量 3.(Internet Protocol)独立IP 4. BR(Boun ...

  9. 运维之道 | Samba 文件共享传输服务(匿名用户访问、指定用户访问、共享账号映射访问)

    前言 1.Samba 概述 Samba 最先在Linux和Windous两个平台之间架起一座桥梁,正式由于Samba的出现,我们可以在Linux系统和Windows系统之间互相通信,比如拷贝文件.实现 ...

  10. Citrix NetScaler Gateway:使用Smart Access实现根据源IP控制用户可访问的交付组

    一.导语 NetScaler Smart Access是NetSacler Gateway的一个高级功能.如果用户是通过NetScaler(ADC)访问应用或桌面,该功能可以限制用户的应用或者桌面的可 ...

最新文章

  1. 如何成为一名优秀的创业公司CTO?
  2. yii required 字段去除*号
  3. 线程池ExcutorThreadPool的运行原理
  4. Leetcode 129. 求根到叶子节点数字之和 解题思路及C++实现
  5. buu 篱笆墙的影子
  6. 17商品推荐系统项目框架
  7. 如何理解CPU上下文切换(二)
  8. spring任务调度的使用
  9. docker安装微信
  10. 在线文本加密解密工具
  11. git 恢复被删除的文件
  12. 微信支付商户朋友圈广告
  13. 版权符号©的输入方法
  14. 基于冷冻电镜图像的低通滤波(Lowpass Filter)算法
  15. BLE(9)—— 细说 Advertising
  16. 小米文件管理android,小米文件管理器
  17. Vulcan 团队信息
  18. 谈谈如何设计秒杀服务
  19. 极豆科技加入飞桨技术伙伴计划,共筑智能网联汽车新生态
  20. Apriltag编解码系统

热门文章

  1. 基于SpringCloud Alibaba实现的论坛
  2. 个人博客升级改造ing
  3. oracle 2500varchar,Oracle中的varchar和varchar2有什么区别?
  4. 为什么训练时测试准确率大幅度波动_Nature Mach Intell|类药性预测准确率有极限...
  5. xml property标签注入一个类变量_依赖注入的学习
  6. java计算日期之间的天数_使用Java计算两个日期之间的天数
  7. c string erase_威刚推出SE770G移动固态硬盘:提供两年质保 附送双头USB-C
  8. 【UVA12230】Crossing Rivers(概率/期望)
  9. 如何找出当前占用磁盘io 最多的进程 - linux,如何找出当前占用磁盘IO最多的进程...
  10. Py2,Py3的差异