前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 窗口函数之头尾函数

MySQL 窗口函数之头尾函数

作者头像
DataScience
发布2020-01-01 22:51:06
1.7K0
发布2020-01-01 22:51:06
举报
文章被收录于专栏:A2DataA2Data

本文标识 : MQ0018

本文编辑 : 长安月下赏美人儿

编程工具 : MySQL、DBeaver

阅读时长 : 6分钟

1、头尾函数

(1)应用场景:快速查看某个窗口范围中的第一个或者最后一个指定的字段的数值

(2)头尾函数分类及基础语法

代码语言:javascript
复制
FIRST_value(指定字段)OVER(PARTITION BY 分区的字段 ORDER BY 排序的字段 DESC/ASC)
LAST_value(字段)OVER (PARTITION BY 分区字段 ORDER BY 排序的字段 DESC/ASC)

(3)两种头尾函数的区别

first_value() 函数

  • 指定排序字段,不同分区中,指定字段在窗口范围第一个值

last_value() 函数

  • 指定排序字段,不同分区中,指定字段在窗口范围最后一个值

(4)实例比较两种头尾函数

代码语言:javascript
复制
SELECT t2.*
      ,FIRST_value(t2.amt)OVER()AS f1
      ,LAST_value(t2.amt)OVER()AS l2
FROM(SELECT t1.dimShopID
      ,t1.dimDateID
      ,SUM(AMT) AS amt
FROM dw.fct_sales AS t1
WHERE dimDateID BETWEEN 20170801 AND 20170810
GROUP BY t1.dimShopID
        ,t1.dimDateID)AS t2
ORDER BY dimShopID,amt DESC;

数据结果:

注意:当函数后无指定分区及排序字段,即 over() 括号内容为空,则会出现上面的结果。

如果函数后有指定的分区及排序的字段又会如何呢?!

此刻,将分享的知识点为窗口的滑动函数!!!

2、滑动函数

(1)基础语法与头尾函数相似

(2)作用:在 over() 中以参数限制窗口分析范围

(3)表示行范围语法

代码语言:javascript
复制
BETWEEN frame_start AND frame_end

(4)frame_start 和 frame_end 如下关键字,精准确定窗口函数分析范围

  • CURRENT ROW :边界是当前行,常与其他关键字组合使用
  • UNBOUNDED PRECEDING :边界是分区中的第一行
  • UNBOUNDED FOLLOWING :边界分区中的最后一行
  • expr PRECEDING:边界为以当前行减去 expr 数值
  • expr FOLLOWING:边界为以当前行加上 expr 数值

(5)举例

代码语言:javascript
复制
#窗口范围是当前行,前 2 行,后 1 行,共计 4 行记录
RANGE BETWEEN  2 PRECEDING AND 1 FOLLOWING
代码语言:javascript
复制
#窗口范围是当前行到分区中的最后一行
RANGE UNBOUNDED FOLLOWING
代码语言:javascript
复制
#窗口范围是当前分区中所有行
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 

(6)实例展示窗口滑动函数

代码语言:javascript
复制
SELECT t2.*
      ,FIRST_value(t2.amt)OVER(PARTITION BY dimShopID ORDER BY t2.amt DESC)AS f1
      ,LAST_value(t2.amt)OVER(PARTITION BY dimShopID ORDER BY t2.amt DESC)AS l2
FROM(SELECT t1.dimShopID
      ,t1.dimDateID
      ,SUM(AMT) AS amt
FROM dw.fct_sales AS t1
WHERE dimDateID BETWEEN 20170801 AND 20170810
GROUP BY t1.dimShopID
        ,t1.dimDateID)AS t2
ORDER BY dimShopID,amt DESC;

数据结果:

注意:经过对比发现,在没有加入限定范围的情况下,得到的结果,并不是理想中的结果。l2 数据列,数据值是混乱的,并不是每个分组中最小的值。

为什么会出现这种情况?!

因为,窗口函数,默认限制范围是第一行到当前行!!!

分析:

  • 目前以 dimShopID 分成两组,且以 amt 数列倒序排列,理想中的结果 l2 数列,当 dimShopID =33 时,数值应当为 37,233.64;当 dimShopID =34时,数值应当为 44,691.52;
  • 因窗口函数,默认限制范围是第一行到当前行,所以 l2 数列呈现与 amt 数列相同。

添加限制范围,则

代码语言:javascript
复制
SELECT t2.*
      ,FIRST_value(t2.amt)OVER(PARTITION BY dimShopID ORDER BY t2.amt DESC)AS f1
      ,LAST_value(t2.amt)OVER(PARTITION BY dimShopID ORDER BY t2.amt DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)AS l2
FROM(SELECT t1.dimShopID
      ,t1.dimDateID
      ,SUM(AMT) AS amt
FROM dw.fct_sales AS t1
WHERE dimDateID BETWEEN 20170801 AND 20170810
GROUP BY t1.dimShopID
        ,t1.dimDateID)AS t2
ORDER BY dimShopID,amt DESC;

数据结果:


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、头尾函数
  • 2、滑动函数
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档