【发布时间】:2018-11-25 12:32:39
【问题描述】:
任务:我想计算第 90 个百分位等待时间的累积值(以天为单位),以确定患者在每个时期和财政年度(包括所有设施的总数)按设施等待超声扫描的时间。
如何:我使用 over(partition by) 表达式来获取 Oracle SQL 中累积的第 90 个百分位数据。
ISSUE: 收到错误 (ORA-00979) “wait_time_days 不是 GROUP BY 表达式”指出累积第 90 个百分位数的表达式 -
这是查询的简化版本:
define period_start = to_date ('20170401', 'yyyy-mm-dd')
define period_end = to_date ('20180331', 'yyyy-mm-dd')
Select
to_char(add_months(c.PROCEDURE_PERFORMED_DT, -3),'YYYY') ||'/'|| to_char(add_months(c.PROCEDURE_PERFORMED_DT, 9),'YY') as Fiscal_year
, nvl (CASE WHEN c.FACILITY_ID = 1 then 'OKANAGAN CLINIC'
WHEN c.FACILITY_ID = 2 THEN 'MELBOURNE CLINIC'
WHEN c.FACILITY_ID = 3 THEN 'VANCOUVER CLINIC'
WHEN c.FACILITY_ID = 4 THEN 'SHWARZ CLINIC'
WHEN c.FACILITY_ID = 5 THEN 'LADYSMITH CLINIC'
END, 'TOTAL') as FACILITY,
, c.PROCEDURE_PERFORMED_DT
, c.BOOKING_DT
, round((c.PROCEDURE_PERFORMED_DT - c.BOOKING_FORM_RECEIVED_DT),2) as wait_time
, p.period
, round(percentile_cont(0.9) within group (order by wait_time asc),2) as Percentile_90th
, percentile_cont(0.9) within group (order by wait_time asc)
over(partition by CASE WHEN c.FACILITY_ID = 1 then 'OKANAGAN CLINIC'
WHEN c.FACILITY_ID = 2 THEN 'MELBOURNE CLINIC'
WHEN c.FACILITY_ID = 3 THEN 'VANCOUVER CLINIC'
WHEN c.FACILITY_ID = 4 THEN 'SHWARZ CLINIC'
WHEN c.FACILITY_ID = 5 THEN 'LADYSMITH CLINIC'
END) as Cumulative_Perc90th
FROM COMPLETED_PROCEDURE c, PERIOD p
WHERE c.PROCEDURE_PERFORMED_DT between &period_start and &period_end
and c.PROCEDURE_PERFORMED_DT = p.END_DATE
Group by
Fiscal_year
, Rollup(CASE WHEN c.FACILITY_ID = 1 then 'OKANAGAN CLINIC'
WHEN c.FACILITY_ID = 2 THEN 'MELBOURNE CLINIC'
WHEN c.FACILITY_ID = 3 THEN 'VANCOUVER CLINIC'
WHEN c.FACILITY_ID = 4 THEN 'SHWARZ CLINIC'
WHEN c.FACILITY_ID = 5 THEN 'LADYSMITH CLINIC'
END)
, period
Order By Facility, period
;
PERIOD 表 (p) 包含一些期间日期的列表,如下所示:
PERIOD START_DATE END_DATE
01 2017-04-01 2017-04-20
02 2017-04-21 2017-05-18
03 2017-05-19 2017-06-15
04 2017-06-16 2017-07-13
感谢您的帮助!
附:我正在使用相同的方法来计算累积量(通过对所有计数的扫描求和)并且它可以正常工作。
【问题讨论】:
-
你有几个带有额外逗号的列表达式;您似乎在
rollup()中非法使用了facility别名(相同级别的查询,如图所示);而您没有在您的 group-by 子句中有wait_time_days那么这应该是在演示第一个或第二个错误吗?目前还不清楚,简化代码似乎引起了令人分心的问题。 See MCVE. -
只是我的两分钱——我想你想使用一些内嵌视图。您在 sql 中使用别名(如 wait_time_days)——但这些别名不能在其他列中引用,除非您将其全部包装在内联视图中(或创建视图)并在外部 sql
-
@AlexPoole:感谢您的评论。我已经编辑了代码并删除了多余的逗号。此外,我在汇总中使用了 Facility 的整个 CASE 语句。我想集中精力解决关于在我的 group-by 子句中有 wait_time 的第一个错误。我将不胜感激。
标签: oracle percentile