背景说明

聚合函数使用不支持keep关键字,例如:
销售表:
SQL> select * from criss_sales where dept_id = 'D02' order by sale_date ;
 
DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT
------- ----------- ---------- -----------
D02     2014/3/6    G00                500
D02     2014/3/6    G01                430
D02     2014/4/8    G02                100
D02     2014/4/27   G01                300
D02     2014/5/2    G03                900


此时有个新需求,希望查看部门 D02 内,销售记录时间最早,销售量最小的记录。

SQL> select
  2      dept_id
  3     ,min(sale_cnt)keep ( dense_rank first order by sale_date) min_early_date
  4  from criss_sales
  5  where dept_id = 'D02'
  6  group by dept_id
  7  ;
 
DEPT_ID  MIN_EARLY_DATE
------- ----------
D02            430

解决方案

您可以通过改写Sql来代替keep语法。

示例

canno=> select dept_id,min(sal_cnt) from (select dense_rank() over (partition by dept_id order by sale_date),* from  criss_sales where dept_id = 'D02' ) t where  dense_rank=1 group by dept_id;
 dept_id | min
---------+-----
 D02     | 430
(1 row)