20160511 GreenPlum6 分析函数之开窗函数、聚合函数与grouping sets用法
2016-05-11 13:41
309 查看
1 开窗函数
测试数据为:
部门 number 工资
发展部 8 6000
发展部 10 5200
销售部 1 5000
销售部 3 4800
发展部 7 4200
销售部 4 4800
发展部 9 4500
私立部 5 3500
私立部 2 3900
发展部 11 5200
用rank()函数,同样工资排名一样,但是排名号会往后窜:
#select 部门,number,工资,rank() over(partition by 部门 order by 工资 desc) from lianxi;
发展部 8 6000 1
发展部 10 5200 2
发展部 11 5200 2
发展部 9 4500 4
发展部 7 4200 5
私立部 2 3900 1
私立部 5 3500 2
销售部 1 5000 1
销售部 3 4800 2
销售部 4 4800 2
用row_number()函数,同样工资排名会不同:
#select 部门,number,工资,row_number() over(partition by 部门 order by 工资 desc) from lianxi;
销售部 1 5000 1
销售部 3 4800 2
销售部 4 4800 3
发展部 8 6000 1
发展部 11 5200 2
发展部 10 5200 3
发展部 9 4500 4
发展部 7 4200 5
私立部 2 3900 1
私立部 5 3500 2
2 聚合函数
所有人工资的总和:这里工资的类型要为numeric
#select *,sum(工资) over() sum1 from lianxi;
发展部 10 5200 47100
私立部 5 3500 47100
发展部 9 4500 47100
销售部 1 5000 47100
发展部 7 4200 47100
发展部 11 5200 47100
发展部 8 6000 47100
销售部 4 4800 47100
销售部 3 4800 47100
私立部 2 3900 47100
所有人工资的累加,先排序,然后第一个工资不动,下一个一次累加:
# select *,sum(工资) over(order by 工资) sum2 from lianxi;
私立部 5 3500 3500
私立部 2 3900 7400
发展部 7 4200 11600
发展部 9 4500 16100
销售部 3 4800 25700
销售部 4 4800 25700
销售部 1 5000 30700
发展部 11 5200 41100
发展部 10 5200 41100
发展部 8 6000 47100
每个部门的工资总和:
# select *,sum(工资) over(partition by 部门) sum3 from lianxi;
发展部 9 4500 25100
发展部 8 6000 25100
发展部 10 5200 25100
发展部 11 5200 25100
发展部 7 4200 25100
销售部 3 4800 14600
销售部 1 5000 14600
销售部 4 4800 14600
私立部 2 3900 7400
私立部 5 3500 7400
部门内排序后递增,但是这里没有明白为什么工资相同的值不进行累加:
#select *,sum(工资) over(partition by 部门 order by 工资) sum4 from lianxi;
私立部 5 3500 3500
私立部 2 3900 7400
销售部 3 4800 9600
销售部 4 4800 9600
销售部 1 5000 14600
发展部 7 4200 4200
发展部 9 4500 8700
发展部 10 5200 19100
发展部 11 5200 19100
发展部 8 6000 25100
3 grouping sets
对于grouping sets 的理解,看书时没看懂,但是自己用数据跑完一遍的时候我明白了这个用法的强大,它先以工资进行分组,再以部门进行分组,很方便:
#select 部门,工资,count(1) from lianxi group by grouping sets(部门,(部门,工资)) order by 工资;
私立部 3500 1
私立部 3900 1
发展部 4200 1
发展部 4500 1
销售部 4800 2
销售部 5000 1
发展部 5200 2
发展部 6000 1
私立部 2
销售部 3
发展部 5
测试数据为:
部门 number 工资
发展部 8 6000
发展部 10 5200
销售部 1 5000
销售部 3 4800
发展部 7 4200
销售部 4 4800
发展部 9 4500
私立部 5 3500
私立部 2 3900
发展部 11 5200
用rank()函数,同样工资排名一样,但是排名号会往后窜:
#select 部门,number,工资,rank() over(partition by 部门 order by 工资 desc) from lianxi;
发展部 8 6000 1
发展部 10 5200 2
发展部 11 5200 2
发展部 9 4500 4
发展部 7 4200 5
私立部 2 3900 1
私立部 5 3500 2
销售部 1 5000 1
销售部 3 4800 2
销售部 4 4800 2
用row_number()函数,同样工资排名会不同:
#select 部门,number,工资,row_number() over(partition by 部门 order by 工资 desc) from lianxi;
销售部 1 5000 1
销售部 3 4800 2
销售部 4 4800 3
发展部 8 6000 1
发展部 11 5200 2
发展部 10 5200 3
发展部 9 4500 4
发展部 7 4200 5
私立部 2 3900 1
私立部 5 3500 2
2 聚合函数
所有人工资的总和:这里工资的类型要为numeric
#select *,sum(工资) over() sum1 from lianxi;
发展部 10 5200 47100
私立部 5 3500 47100
发展部 9 4500 47100
销售部 1 5000 47100
发展部 7 4200 47100
发展部 11 5200 47100
发展部 8 6000 47100
销售部 4 4800 47100
销售部 3 4800 47100
私立部 2 3900 47100
所有人工资的累加,先排序,然后第一个工资不动,下一个一次累加:
# select *,sum(工资) over(order by 工资) sum2 from lianxi;
私立部 5 3500 3500
私立部 2 3900 7400
发展部 7 4200 11600
发展部 9 4500 16100
销售部 3 4800 25700
销售部 4 4800 25700
销售部 1 5000 30700
发展部 11 5200 41100
发展部 10 5200 41100
发展部 8 6000 47100
每个部门的工资总和:
# select *,sum(工资) over(partition by 部门) sum3 from lianxi;
发展部 9 4500 25100
发展部 8 6000 25100
发展部 10 5200 25100
发展部 11 5200 25100
发展部 7 4200 25100
销售部 3 4800 14600
销售部 1 5000 14600
销售部 4 4800 14600
私立部 2 3900 7400
私立部 5 3500 7400
部门内排序后递增,但是这里没有明白为什么工资相同的值不进行累加:
#select *,sum(工资) over(partition by 部门 order by 工资) sum4 from lianxi;
私立部 5 3500 3500
私立部 2 3900 7400
销售部 3 4800 9600
销售部 4 4800 9600
销售部 1 5000 14600
发展部 7 4200 4200
发展部 9 4500 8700
发展部 10 5200 19100
发展部 11 5200 19100
发展部 8 6000 25100
3 grouping sets
对于grouping sets 的理解,看书时没看懂,但是自己用数据跑完一遍的时候我明白了这个用法的强大,它先以工资进行分组,再以部门进行分组,很方便:
#select 部门,工资,count(1) from lianxi group by grouping sets(部门,(部门,工资)) order by 工资;
私立部 3500 1
私立部 3900 1
发展部 4200 1
发展部 4500 1
销售部 4800 2
销售部 5000 1
发展部 5200 2
发展部 6000 1
私立部 2
销售部 3
发展部 5
相关文章推荐
- iOS开发——关于适用用SDWebImage
- 垂直外边距合并--CSS的Margin属性:详解margin属性
- 将color转为UIImage
- HDU,1232,畅通工程
- 单例模式将配置文件加载在jvm内存,修改配置文件,可调用reload方法重新加载至内存
- Spring 如何读取properties文件内容
- SQL查询语句
- docker - 从安装到部署一个web应用(go、java)
- 数据库-封锁(locking)
- AC 自动机 HDU 2896
- 一个成功男人30岁前应该完成的那些事情
- Nginx 概述及日常管理
- ThreadLocal 为线程绑定对象
- OpenGL ES Shader相关API 总结【0】——获取绘制信息
- android音乐播放器Media
- 巧用ViewPager 打造不一样的广告轮播切换效果
- Haproxy+keepalived实现高可用负载均衡
- 如何优化 Android Studio 启动、编译和运行速度?
- java.util.concurrent 之Executors
- Jenkins安装和配置