sql中我们经常会用到聚合函数,聚合之后它会减少数据量,但是如果我们想把聚合之后的数据和原始数据同时展示出来,那么我们需要用到窗口函数。
lag窗口函数通过条件把数据划分成子类,在子类中进行排序
格式 lag(list_name,num) over(partition by ___ order by )
实例:
原始数据:
+----------------+---------------------+----------------+--+
| business.name | business.orderdate | business.cost |
+----------------+---------------------+----------------+--+
| jack | 2017-01-01 | 10 |
| tony | 2017-01-02 | 15 |
| jack | 2017-02-03 | 23 |
| tony | 2017-01-04 | 29 |
| jack | 2017-01-05 | 46 |
| jack | 2017-04-06 | 42 |
| tony | 2017-01-07 | 50 |
| jack | 2017-01-08 | 55 |
| mart | 2017-04-08 | 62 |
| mart | 2017-04-09 | 68 |
| neil | 2017-05-10 | 12 |
| mart | 2017-04-11 | 75 |
| neil | 2017-06-12 | 80 |
| mart | 2017-04-13 | 94 |
+----------------+---------------------+----------------+--+
4查询顾客上次的购买时间
select name,orderdate cost,
lag(orderdate,1)
over (
partition by name
order by orderdate) last_time
from business
解析:lag(orderdate,1)
此处是以orderdate为分组,1代表往前1条数据
同理,如果是lead函数,lead(orderdate,1) 则表示往后1条数据
相信大家看了之后还是不明白他有什么用处,精髓就在于将聚合的数据和原始数据一同查询出来,避免了自关联连表的资源占用问题,提高了效率。
举个例子:
我们数据库中有一张百万甚至千万级别的表,现在我们要查询,但是,需要A数据中的m字段和B数据中的n字段进行运算,又恰好你的数据是有一定的规律进行运算的,当然通过表的自关联可以解决,但是对于一张数据量大的表来说,自关联可想而知,效率极低。我们就可以利用窗口函数,在表中直接进行分组排序,运算了,这样不仅减少了资源占用,同时提高了运行效率.