百度推广就是做网站吧,队标logo设计简单,新闻最近新闻10条,什么样的网站域名好窗口函数不是将数据汇总成单个结果#xff0c;而是为每一行数据都返回一个结果。完整的窗口函数的定义#xff1a;window_function over(partition by...-- 分区参数 order by... -- 排序参数 frame_clause -- 窗口大小 );以下代码所用数据集在之前的文章中可以找到。select…窗口函数不是将数据汇总成单个结果而是为每一行数据都返回一个结果。完整的窗口函数的定义window_function over(partition by...-- 分区参数 order by... -- 排序参数 frame_clause -- 窗口大小 );以下代码所用数据集在之前的文章中可以找到。select name , dept_id,sum(salary) over(partition by dept_id) from emp; select dept_id ,sum(salary) from emp group by dept_id; -- order by 用于指定分区内的数据的排序方式作用类似于查询语句中的order by 子句。 select name ,salary, dept_id,sum(salary) over(partition by dept_id order by salary) from emp;聚合窗口函数移动平均值avg 函数作为窗口函数使用时可以用于计算随着当前行移动的窗口内数据行的平均值。例查找不同产品截止每个月最近三个月的平均销量。create table sales_monthly( product varchar(10), ym int, amount int ); insert into sales_monthly values (橘子,201801,10128),(橘子,201802,10221),(橘子,201803,10257),(橘子,201804,10386),(橘子,201805,11400),(橘子,201806,10566),(橘子,201807,10623),(橘子,201808,10697)(苹果,201801,10118),(苹果,201802,10211),(苹果,201803,10247),(苹果,201804,10286),(苹果,201805,11410),(苹果,201806,10565),(苹果,201807,10633),(苹果,201808,10687); select product as 产品, ym 年月, amount 销量, avg(amount) over (partition by product order by ym rows between 2 preceding and current row) as 平均销量 from sales_monthly order by product, ym; -- 当前平均值取的是当前日期和前两天的平均值。也可更改为当前日期为中间值select product as 产品, ym 年月, amount 销量, avg(amount) over (partition by product order by ym rows between 1 preceding and 1 following) as 平均销量 from sales_monthly order by product, ym;当不指定时就是累计结果。select product as 产品, ym 年月, amount 销量, avg(amount) over(partition by product order by ym) as 平均销量 from sales_monthly order by product,ym;range关键字为单位指定窗口的偏移量。比如 查找短期内5天累计转账超过100万元的账号select log_ts,from_user,total_amount from ( select log_ts,from_user,sum(amount) over ( partition by from_user order by log_ts range interval 5 day preceding) as total_amount from transfer_log where type 转账) t where total_amount 1000000;排名窗口函数可以用来获取数据的分类排名。 常见的排名窗口函数如下row_number 函数可以为分区中的每行数据分配一个序列号序列号从1开始。rank 函数返回当前行在分区中的名次。如果存在名次相同的数据后续的排名将会产生跳跃。dense_rank 函数返回当前行在分区中的名次。即使存在名次相同的数据后续排名也是连续值。percent_rank 函数以百分比的形式返回当前行在分区中的名次。如果存在名次相同的数据后续的排名将会产生跳跃。cume_dist 函数计算当前行在分区内的积累分布。ntile函数将分区内的数据分为N等分并返回当前行所在分片的位置。排名窗口函数不支持动态的窗口大小选项而是以整个分区作为分析的窗口。排名窗口函数不支持动态的窗口大小选项而是以整个分区作为分析的窗口。select name,dept_id,salary, row_number() over (partition by dept_id order by salary desc), rank() over (partition by dept_id order by salary desc), dense_rank() over (partition by dept_id order by salary desc), percent_rank() over (partition by dept_id order by salary desc) from emp; -- 可以用Window 封装 为 w window w as (partition by dept_id order by salary desc); (要在后面定义。 select name,dept_id,salary, row_number() over w, rank() over w, dense_rank() over w, percent_rank() over w from emp window w as (partition by dept_id order by salary desc);cume_dist 函数返回当前行在分区内的累积分布也就是排名在当前行之前包含当前行所有数据所占的比率取值范围大于0且小于或等于1.-- 例如 查询返回所有员工按照月薪排名的累积分布情况 select name 姓名,salary, cume_dist() over( order by salary) 累计占比 from emp;ntile 函数用于将分区内的数据分成N等分并计算当前行所在的分片位置。-- 例以下语句将员工按照入职先后顺序分为5组并计算每个员工所在的分组 select name 姓名,entrydate , ntile(5) over (order by entrydate) from emp;取值窗口函数lag函数返回窗口内当前行之前的第N行数据lead函数可以返回窗口内当前行之后的第N行数据。first_value 返回窗口内第一行数据。last_value 返回窗口内最后一行数据。nth_value 返回窗口内第N行数据。-- 案例分析环比、同比分析 -- 环比是本期与上期数据相比的增长例产品6月的销量与五月的销量相比增加的部分 select product,ym,(amount-pre_amount)/pre_amount delta from( select * ,lag(amount,1) over (partition by product order by ym) pre_amount from sales_monthly) t; -- 同比增长 今年6月和 上一年6 月的销售相比增长的部分。lag(amount,12)当数据中每个月份的数据都有时该字段表示当前月份之前第12期的销量即去年同月份的销量 -- 复合增长率 每一期和第一期作比较LAG(column, n, default_value)中的n表示向前第n行default_value指定无数据时的默认值如0或NULL。三类核心窗口函数对比类别核心函数核心作用关键特点典型应用场景聚合窗口函数SUM(),AVG(),COUNT(),MAX(),MIN()在窗口内进行聚合计算不折叠行。与OVER()联用将聚合结果“铺展”到每一行明细上。计算累计值、移动平均值、每组内占比。排名窗口函数ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE(n)为窗口内每一行生成序号或排名。ORDER BY子句必不可少决定了排序和排名依据。生成连续序号、并列排名、数据分箱如分为上中下三组。取值窗口函数LAG(),LEAD(),FIRST_VALUE(),LAST_VALUE(),NTH_VALUE()访问窗口内其他行的值。实现了行与行之间的直接对话是计算环比、同比的基础。总结灵魂在于OVER()子句定义PARTITION BY分组和ORDER BY排序是写出正确窗口函数的关键。性能关键在PARTITION BY和ORDER BY涉及的列上建立索引能极大提升执行效率。组合使用窗口函数可以组合。例如可以先计算累计值聚合函数再对累计值进行排名。SELECT *, RANK() OVER (ORDER BY cumulative_amount DESC) FROM ( SELECT *, SUM(amount) OVER (PARTITION BY employee_id ORDER BY sale_date) AS cumulative_amount FROM sales ) t;