Oracle SQL PERCENT_RANK 多个分组内的汇总数据

Oracle SQL PERCENT_RANK Summed Data Within Multiple Groupings

我正在尝试显示基于不同分组的百分比排名。我最初尝试的代码类似于下面的代码。

我没有意识到的问题是 'over partition' 没有忽略我的分组。因为我找不到解决这个问题的方法...我最终使用 CTE 将数据分组到我想要的百分位排名,然后对我需要的每个百分位组使用子查询 (10+)。

是否有更有效的方法来实现我下面的意图?

SELECT 
,employee
,dept
,location
,shift
,fq
,fm
,day
,sum(calls)
,sum(handletime)

/*YTD P RANKS */ 

,PERCENT_RANK() over (partition by dept order by DECODE(sum(calls),0,0,sum(handletime) / sum(calls)) DESC) as YTD_P_RANK_ALL_LOCATIONS
,PERCENT_RANK() over (partition by dept, location by DECODE(sum(calls),0,0,sum(handletime) / sum(calls)) DESC) as YTD_P_RANK_LOCAL_LOCATION
,PERCENT_RANK() over (partition by dept, shift by DECODE(sum(calls),0,0,sum(handletime) / sum(calls)) DESC) as YTD_P_RANK_SHIFT

/*QTD P RANKS */ 

,PERCENT_RANK() over (partition by fq, dept order by DECODE(sum(calls),0,0,sum(handletime) / sum(calls)) DESC) as QTD_P_RANK_ALL_LOCATIONS
,PERCENT_RANK() over (partition by fq, dept, location by DECODE(sum(calls),0,0,sum(handletime) / sum(calls)) DESC) as QTD_P_RANK_LOCAL_LOCATION
,PERCENT_RANK() over (partition by fq, dept, shift by DECODE(sum(calls),0,0,sum(handletime) / sum(calls)) DESC) as QTD_P_RANK_SHIFT


from table1

group by 

,employee
,dept
,location
,shift
,fq
,fm
,day

(已编辑)我想如果您将查询分为 3 个步骤,您可能会成功:

  1. 先计算总和。
  2. 计算百分比排名。
  3. 应用你的最终 group by.

希望这能让您更接近您想要做的事情。

WITH SumView AS (
  SELECT t.*
         ,sum(calls) over (partition by dept) AS sum_call_by_dept
         ,sum(handletime) over (partition by dept) AS sum_ht_by_dept
         ,sum(calls) over (partition by dept, location) AS sum_call_by_dept_loc
         ,sum(handletime) over (partition by dept, location) AS sum_ht_by_dept_loc
         ,sum(calls) over (partition by dept, shift) AS sum_call_by_dept_shift
         ,sum(handletime) over (partition by dept, shift) AS sum_ht_by_dept_shift
         ,sum(calls) over (partition by fq, dept) AS sum_call_by_fq_dept
         ,sum(handletime) over (partition by fq, dept) AS sum_ht_by_fq_dept
         ,sum(calls) over (partition by fq, dept, location) AS sum_call_by_fq_dept_loc
         ,sum(handletime) over (partition by fq, dept, location) AS sum_ht_by_fq_dept_loc
         ,sum(calls) over (partition by fq, dept, shift) AS sum_call_by_fq_dept_shift
         ,sum(handletime) over (partition by fq, dept, shift) AS sum_ht_by_fq_dept_shift
    FROM table1 t
),  PercentRankView AS (
  SELECT t.*
         /*YTD P RANKS */ 

         ,PERCENT_RANK() over (partition by dept order by DECODE(sum_call_by_dept,0,0,sum_ht_by_dept / sum_call_by_dept) DESC) as YTD_P_RANK_ALL_LOCATIONS
         ,PERCENT_RANK() over (partition by dept, location by DECODE(sum_call_by_dept_loc,0,0,sum_ht_by_dept_loc / sum_call_by_dept_loc) DESC) as YTD_P_RANK_LOCAL_LOCATION
         ,PERCENT_RANK() over (partition by dept, shift by DECODE(sum_call_by_dept_shift,0,0,sum_ht_by_dept_shift / sum_call_by_dept_shift) DESC) as YTD_P_RANK_SHIFT

         /*QTD P RANKS */ 

         ,PERCENT_RANK() over (partition by fq, dept order by DECODE(sum_call_by_fq_dept,0,0,sum_ht_by_fq_dept / sum_call_by_fq_dept) DESC) as QTD_P_RANK_ALL_LOCATIONS
         ,PERCENT_RANK() over (partition by fq, dept, location by DECODE(sum_call_by_fq_dept_loc,0,0,sum_ht_by_fq_dept_loc / sum_call_by_fq_dept_loc) DESC) as QTD_P_RANK_LOCAL_LOCATION
         ,PERCENT_RANK() over (partition by fq, dept, shift by DECODE(sum_call_by_fq_dept_shift,0,0,sum_ht_by_fq_dept_shift / sum_call_by_fq_dept_shift) DESC) as QTD_P_RANK_SHIFT
    FROM SumView t
)
SELECT employee
       ,dept
       ,location
       ,shift
       ,fq
       ,fm
       ,day
       ,sum(calls)
       ,sum(handletime)
       ,YTD_P_RANK_ALL_LOCATIONS
       ,YTD_P_RANK_LOCAL_LOCATION
       ,YTD_P_RANK_SHIFT
       ,QTD_P_RANK_ALL_LOCATIONS
       ,QTD_P_RANK_LOCAL_LOCATION
       ,QTD_P_RANK_SHIFT
  FROM PercentRankView
 GROUP BY employee
          ,dept
          ,location
          ,shift
          ,fq
          ,fm
          ,day
          ,YTD_P_RANK_ALL_LOCATIONS
          ,YTD_P_RANK_LOCAL_LOCATION
          ,YTD_P_RANK_SHIFT
          ,QTD_P_RANK_ALL_LOCATIONS
          ,QTD_P_RANK_LOCAL_LOCATION
          ,QTD_P_RANK_SHIFT