mysql查询的一些函数_MySQL窗口函数能够实现某种复杂的查询

本文通过一个示例介绍了SQL窗口函数如何简化复杂查询,特别是当需要在分组查询中获取特定位置的值时。利用窗口函数nth_value(),可以在不额外循环处理数据的情况下,直接在SQL中获取每个分组内的第n个值,从而提高效率。通过一条SQL语句,实现了对数据的分组、平均值计算、特定位置值的获取以及计数,展示了窗口函数在数据处理中的便利性。
摘要由CSDN通过智能技术生成

199227717_1_20200813105211677

先使用一个简单的例子引入问题,这个示例说明了我为什么要使用窗口函数,以及它给写sql和程序逻辑实现上带来了哪些便捷性。

例如有这样一张表window_function:select * from window_function;idcodeVALUE

1ST000120.1

2ST000121.5

3ST000218.9

4ST000123.1

5ST000214.7

6ST000122.1

7ST000217.8

8ST000216.4

9ST000219.9

上表中只有两种编号ST0001和ST0002,现在我们查询该表并获得两条记录,一种编号一条,形式如下:codeavg_valuethird_valuecount

ST000121.704

ST000217.545

说明:

code:window_function表中的code编号;

avg_value:window_function表中value的按code分组平均值;

third_value:window_function表中按code分组后再按value正向排序后的第3个value值。

count:window_function表中分组统计个数。

如果没有这个third_value,也就是第三个值,我们直接用group by 就可以获得:SELECT `code`, avg(`value`) as avg_value, count(1) as count FROM `window_function` group by code;

但是现在要在加上一列,就是每个分组中的第3个值也要列出来,怎么实现?

当然如果是在正常的写程序过程中,可以先根据code分组查询出一个List,然后再循环这个List,再在数据库中查询第3个值,再赋值到List中:select `value` from `window_function` where `code` = 'ST0001' order by value asc limit 2,1;

注:limit记录从0开始。

可是要是这样做就对不起我的“懒惰”,平生最大的爱好:“懒(lazy)”。我想一条sql搞定,直接上sql语句:select t.*, nth_value(`value`, 3) over w as third_value from `window_function` t window w as (partition by `code` order by `value` asc);

这条sql是运用window窗口函数在每行上都加上一个third_value值;window as (partition by `code` order by `value` asc)

这条sql 定义了一个窗口,按code分区,按value排序;nth_value(`value`, 3) over w as third_value;

这个sql就是找出窗口中第三个value值,并作为third_value字段。

结果如下:

id     code         value  third_value

1ST000120.1

2ST000121.5

6ST000122.122.1

4ST000123.122.1

5ST000214.7

8ST000216.4

7ST000217.817.8

3ST000218.917.8

9ST000219.917.8

third_value为null很正常,因为还没有到3条记录,所以没有,比如第1、2条记录是没有的。

那么在这个sql的基础上做一次group by就可以了,如下:select v.code, avg(v.value) as avg_value, max(v.third_value) as third_value, count(1) as count from (select t.*, nth_value(`value`, 3) over w as third_value from `window_function` t window w as (partition by `code` order by `value` asc)) v group by code;

得到的结果如下:codeavg_valuethird_valuecount

ST000121.7022.14

ST000217.5417.85

这样就一条sql搞定了吧。

下面列出一些窗口函数:

我们这里只用了NTH_VALUE()获取窗口是第几个值。序号函数:row_number() / rank() / dense_rank()

分布函数:percent_rank() / cume_dist()

前后函数:lag() / lead()

头尾函数:first_val() / last_val()

其他函数:nth_value() / nfile()

用法就是:

函数名([expr]) over子句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值