开窗函数

开窗函数,第1张

开窗函数

需求:

既要显示聚合前的数据,又要显示聚合后的结果

rank

开窗函数:

窗口函数: 窗口 + 函数

窗口: 函数运行时计算的数据集的范围

函数:运行时的函数:

1.常用的聚合函数

2.窗口内置的函数

1.聚合函数 -》开窗

数据:

需求:

统计累计的问题,每个用户每天累计点外卖的次数

函数 over([partition by xxx,...] [order by xxx,...])

2.指定窗口大小

3.开窗 -内置函数

RANK

ROW_NUMBER

DENSE_RANK

NTILE

1.NTILE

需求:

把数据按照姓名进行分组 时间排序 结果数据分成 3份数

NTILE(N):

把数据平均分配到N中,如果不能平均分配,优先分配到较小的编号中。

2.rank相关的

RANK

ROW_NUMBER

DENSE_RANK

RANK:

从1开始,按照顺序,生成组内记录的编号,排序相同会重复,在名次中留下空位

ROW_NUMBER:

从1开始,按照顺序,生成组内记录的编号,序号没有重复的

DENSE_RANK:

从1开始,按照顺序,生成组内记录的编号,排序相同会重复,在名次中不留下空位

3.蹿行问题

lag 向上取第几行

lead向下取第几行

4.取值问题

FIRST_VALUE(col):取分组后 截止到当前行 第一个值

LAST_VALUE(col):取分组后 截止到当前行 最后一个值

开窗函数案例:

1.我们有如下的用户访问数据

userId visitDate visitCount

u01 2017/1/21 5

u02 2017/1/23 6

u03 2017/1/22 8

u04 2017/1/20 3

u01 2017/1/23 6

u01 2017/2/21 8

U02 2017/1/23 6

U01 2017/2/22 4

要求使用SQL统计出每个用户的累积访问次数,如下表所示:

用户id月份 小计 累积

u01 2017-01 11 11

u01 2017-02 12 23

u02 2017-01 12 12

u03 2017-01 8 8

u04 2017-01 3 3

每个用户的累积访问次数=》

每个用户每个月累计访问次数

维度: 用户、月

指标:次数、累计访问次数

1.etl:

2017/2/22 =》 2017-02 日期函数 ,string函数 sql里面

2017/2/22=>2017-2-22

2.

1.先求 每个月 次数

2. 1结果 =》 累计

也可以使用str_to_date

date_format(str_to_date(visitdate,'%Y/%m/%d') ,'%Y-%m')as month

2.有50W个京东店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志,

访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,数据如下:

u1 a

u2 b

u1 b

u1 a

u3 c

u4 b

u1 a

u2 c

u5 b

u4 b

u6 c

u2 c

u1 b

u2 a

u2 a

u3 a

u5 a

u5 a

u5 a

请统计:

(1)每个店铺的UV(访客数) 、pv(访问量)

维度:店铺

指标:uv =》user_id

(2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数

维度:店铺、 访客id

指标:访问次数 、访问次数的top3

uv pv :

pv =>page 次数 不需要去重

uv =>user 次数 需要去重

2.行转列 &&& 列转行

1.列转行

||

v

zuoshao,<王者荣耀,黑丝,看小视频>

xuanxuan,<姐姐,天天,杰伦>

mysql没有collection_list(hobby)

可以使用group_concat(hobby)

-- hive

select

name,

concat_ws(",",collection_list(hobby)) as hobbyies

from t1

group by

name

concat_ws

concat

2.行转列

hive爆破函数实现

mysql没有爆破函数(免费版本没有)

首先把不为null的数据取出来放在数组中,接着对增加一个字段,如果为null,那么就为0否则为1 ,接着原表开窗(sum()) 取数组中arr[rn-1] 的数据

首先排除为null的,把时间lead上移.如果原表的时间在这个区间,那么就取这个区间的时间

发现join重复数据,采用了过滤为null的值,能否采用其他方法

mysql8.0以前,排序对于大多数用户来说都是个“难题”,因为没有像sqlserver和oracle等数据库有开窗函数,但是也是有方法解决的。就是利用自定义变量,但是理解起来有点难。

但mysql8.0上线后,已经支持开窗函数了。你可以升级最新版。对于低版本,我可以举个例子你看看,

按person分组排序的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7082034.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存