对一定时间段内的数据进行Percentile计算(用PERCENTILE_CONT()).表1:数据类别的计算参数
CAT_ID      MIN_RESULTS_IN_SET       MAX_RESULTS_IN_SET        SET_RESULTS_PERIOD(DAYS)
===================================================================================
SA001                  3                                     4                                          6
SE023                  2                                     3                                          5
SC231                  4                                     4                                          4
...表2:数据   (日期为 日/月/年)  假设需要进行1/1/01到23/1/01的计算
CAT_ID       RESULT_DATE           RESULT         |||| 对应此行需要的输出结果
========================================
...
SA001             1/1/01                       89                 -->无。因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为1,小于(MIN_RESULTS_IN_SET =  3)SA001             2/1/01                       12                 -->无。因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为2,小于(MIN_RESULTS_IN_SET =  3)SA001             3/1/01                       32                 -->因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为3 == MIN_RESULTS_IN_SET,所以
输出3/1/01的计算结果--PERCENTILE_CONT(0.5)这个计算是基于1/1/01,2/1/01和3/1/01这3条数据的。SA001             4/1/01                       22                 -->因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为4 > MIN_RESULTS_IN_SET,=MAX_RESULTS_IN_SET,所以
输出4/1/01的计算结果--PERCENTILE_CONT(0.5)这个计算是基于1/1/01,2/1/01,3/1/01和4/1/01这4条数据的。SA001             6/1/01                       42                 -->因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为6(1,2,3,4,6/1/01) > MIN_RESULTS_IN_SET,同时>MAX_RESULTS_IN_SET,只取前4条(MAX_RESULTS_IN_SET)数据。所以
输出6/1/01的计算结果--PERCENTILE_CONT(0.5)这个计算是基于1/1/01,2/1/01,3/1/01,4/1/01这4条数据的。SA001             9/1/01                       42                 -->因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为3(4,6,9/1/01) == MIN_RESULTS_IN_SET,<MAX_RESULTS_IN_SET,所以
输出9/1/01的计算结果--PERCENTILE_CONT(0.5)这个计算是基于4/1/01,6/1/01和9/1/01这3条数据的。SA001            13/1/01                       37                 -->无。因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为2(9,13/1/01),小于(MIN_RESULTS_IN_SET =  3)SA001            15/1/01                       38                 -->无。因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为2(13,15/1/01),小于(MIN_RESULTS_IN_SET =  3)
SA001            22/1/01                       13                 -->无。因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为1(22/1/01),小于(MIN_RESULTS_IN_SET =  3)
SA001            23/1/01                       86                 -->无。因为此日(含)及之前6日(SET_RESULT_PERIOD)的数据数目为2(22,23/1/01),小于(MIN_RESULTS_IN_SET =  3)
...
所以最后有如下的计算结果:
SA001             3/1/01                       xxx
SA001             4/1/01                       xxx
SA001             6/1/01                       xxx
SA001             9/1/01                       xxx
针对以上的需求,似乎用简单的SQL难以解决。我试了一些Aggregate Function/Analytic Function:*** select result_dt, result, count(*) OVER(order by result_dt range 4 preceding) CNT from test*** SELECT DISCHARGE_POINT_ID, PERCENTILE_CONT(0.8) WITHIN GROUP (ORDER BY RESULT) PERCENTILE_80 FROM PSD_RESULT WHERE RESULT_DT>'03/JUL/03' AND RESULT_DT<'03/SEP/03' GROUP BY DISCHARGE_POINT_ID因为PERCENTILE_CONT()本身不支持WINDOWING_CLAUSE,所以要实现上述需求有些困难。我是业余新手,对Oracle了解不多,希望哪位能够指点一下。我是应该做一个函数(User-defined Function),还是组合几个SQL查询任何可能的方向,都请给些提示。谢谢!
100pts.