对一定时间段内的数据进行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.
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.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货