在Oracle中聚合函数保持DENSE_RANK用于获取在某个列分组的情况下按某个字段排序得到的聚合函数(如最大值/最小值等)值。
现有测试数据,先在账户分组的情况下,每个分组按id正序排序(即最大id)的马克斯(信贷)。
<前> <代码>——甲骨文 删除表t_event; 创建表t_event (id int, int,类型varchar2(30),信用卡号,delta_balance号码); 截断表t_event; 插入t_event (id、账户类型、信贷delta_balance)值(1,1,“创建”,0,0); 插入t_event (id、账户类型、信贷delta_balance)值(2,1,“沉积”,null, 100); 插入t_event (id、账户类型、信贷delta_balance)值(3、1,“撤销”,null, -50); 插入t_event (id、账户类型、信贷delta_balance)值(4 1 credit_set, 50岁,null); 插入t_event (id、账户类型、信贷delta_balance)值(5、1,“撤销”,-30年,null); 插入t_event (id、账户类型、信贷delta_balance)值(6个,1“credit_set”, 100年,null); 插入t_event (id、账户类型、信贷delta_balance)值(7 1‘退出’,null, -100); -- 插入t_event (id、账户类型、信贷delta_balance)值(8 2“credit_set”, 150年,null); 插入t_event (id、账户类型、信贷delta_balance)值(9 2“credit_set”, 110年,null); 插入t_event (id、账户类型、信贷delta_balance)值(10 2 credit_set, 20, -100); 提交; ——PG 删除表如果存在t_event; 创建表t_event (id int, int,类型为varchar(30),信贷int, int delta_balance); 截断表t_event; 插入t_event (id、账户类型、信贷delta_balance)值(1,1,“创建”,0,0); 插入t_event (id、账户类型、信贷delta_balance)值(2,1,“沉积”,null, 100); 插入t_event (id、账户类型、信贷delta_balance)值(3、1,“撤销”,null, -50); 插入t_event (id、账户类型、信贷delta_balance)值(4 1 credit_set, 50岁,null); 插入t_event (id、账户类型、信贷delta_balance)值(5、1,“撤销”,-30年,null); 插入t_event (id、账户类型、信贷delta_balance)值(6个,1“credit_set”, 100年,null); 插入t_event (id、账户类型、信贷delta_balance)值(7 1‘退出’,null, -100); -- 插入t_event (id、账户类型、信贷delta_balance)值(8 2“credit_set”, 150年,null); 插入t_event (id、账户类型、信贷delta_balance)值(9 2“credit_set”, 110年,null); 插入t_event (id、账户类型、信贷delta_balance)值(10 2 credit_set, 20, -100); 提交; 代码>
<强>甲骨文强>
甲骨文可使用保持DENSE_RANK实现
<前>
<代码> TEST-orcl@DESKTOP-V430TU3>选择
2,
3马克斯(信贷)
4保持(DENSE_RANK去年订单id)信贷
5
6 t_event
7类型=癱redit_set”
8组
9账户;
信用帐户
- - - - - - - - - - - - - - - - - - - - -
1 100
2 20
代码>
<强> PG 强>
PG没有保持DENSE_RANK实现,但可通过数组的比较来实现。
<前>
<代码>(本地):5432 pg12@testdb=#选择
pg12@testdb - #账户,
pg12@testdb - # (MAX(数组(id、信贷))过滤器(type=' credit_set '))[2]随着信贷
pg12@testdb——#
pg12@testdb - # t_event
pg12@testdb - #组
pg12@testdb - #帐户
通过账户pg12@testdb - #订单;
账户|信用
- - - - - - - - - - - - + - - - - - - - - - -
1 | 100
2 | 20
(2行)
时间:1.206毫秒
代码>
注意(MAX(数组(id、信贷))过滤器(type=' credit_set '))[2],把id和信贷组成元素作为数组中的元素,由于id为第一个元素,因此在比较数组元素时,会首先比较id值得到最大的id值的数组元素,然后取数组元素中的第2个成员的值([2]的含义)。
<强>参考资料强>
第一个
MAX()使(DENSE_RANK LAST ORDER BY)对()()分区
如何获得第一个或最后一个值在一组在SQL中使用Group By