甲骨文和PostgreSQL开发(14)-分析函数保持DENSE_RANK

  

在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

甲骨文和PostgreSQL开发(14)-分析函数保持DENSE_RANK