【问题标题】:Cumulative 90th Percentile Values by Time Period in Oracle SQLOracle SQL 中按时间段的累计第 90 个百分位值
【发布时间】:2019-04-06 01:50:53
【问题描述】:

我的目标是计算在 3 家医院等待接受服务 5 期的患者的第 90 个百分位等待时间的累积值。

每个时间段对应一个特定的时间线(例如,时间段 1 (P01) 表示患者在 2018 年 4 月 1 日至 2018 年 5 月 3 日之间接受过服务,时间段 2(P02,2018 年 5 月 5 日至 5 月之间的服务) 2018 年 3 月 31 日)。

我的原始查询非常复杂,这里是它的简化版本。 我的表格由 3 列组成:

 CREATE TABLE Mytable1(
period varchar2(10),
hospital varchar2(100),
 wait_days int
);

然后插入等待时间的值(以天为单位),每个医院五个,因为有 5 个周期。

INSERT ALL
INTO Mytable1(period,hospital,wait_days) VALUES ('P01', 'NANAIMO HOSPITAL',182)
INTO Mytable1(period,hospital,wait_days) VALUES ('P02','NANAIMO HOSPITAL',187)
INTO Mytable1(period,hospital,wait_days) VALUES ('P03','NANAIMO HOSPITAL',188)
INTO Mytable1(period,hospital,wait_days) VALUES ('P04','NANAIMO HOSPITAL',182)
INTO Mytable1(period,hospital,wait_days) VALUES ('P05','NANAIMO HOSPITAL',190)
INTO Mytable1(period,hospital,wait_days) VALUES ('P01','VICTORIA HOSPITAL',230)
INTO Mytable1(period,hospital,wait_days) VALUES ('P02','VICTORIA HOSPITAL',241)
INTO Mytable1(period,hospital,wait_days) VALUES ('P03','VICTORIA HOSPITAL',245)
INTO Mytable1(period,hospital,wait_days) VALUES ('P04','VICTORIA HOSPITAL',237)
INTO Mytable1(period,hospital,wait_days) VALUES ('P05','VICTORIA HOSPITAL',240)
INTO Mytable1(period,hospital,wait_days) VALUES ('P01','ARBUTUS HOSPITAL',156)
INTO Mytable1(period,hospital,wait_days) VALUES ('P02','ARBUTUS HOSPITAL',163)
INTO Mytable1(period,hospital,wait_days) VALUES ('P03','ARBUTUS HOSPITAL',144)
INTO Mytable1(period,hospital,wait_days) VALUES ('P04','ARBUTUS HOSPITAL',158)
INTO Mytable1(period,hospital,wait_days) VALUES ('P05','ARBUTUS HOSPITAL',165)
SELECT 1 FROM DUAL;

现在我使用没有 Group By 子查询的分析版本来计算第 90 个百分位的等待时间:

SELECT period, hospital,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY wait_days) OVER (PARTITION BY hospital) as percentile
FROM Mytable1
order by period, hospital;

这是我的结果:

PERIOD  HOSPITAL    PERCENTILE
P01 ARBUTUS HOSPITAL    164.2
P01 NANAIMO HOSPITAL    189.2
P01 VICTORIA HOSPITAL   243.4
P02 ARBUTUS HOSPITAL    164.2
P02 NANAIMO HOSPITAL    189.2
P02 VICTORIA HOSPITAL   243.4
P03 ARBUTUS HOSPITAL    164.2
P03 NANAIMO HOSPITAL    189.2
P03 VICTORIA HOSPITAL   243.4
P04 ARBUTUS HOSPITAL    164.2
P04 NANAIMO HOSPITAL    189.2
P04 VICTORIA HOSPITAL   243.4
P05 ARBUTUS HOSPITAL    164.2
P05 NANAIMO HOSPITAL    189.2
P05 VICTORIA HOSPITAL   243.4

我在每个时期都得到相同的第 90 个百分位。我想知道如何获得每个后续期间的第 90 个百分位数的累积值。基本上,我需要根据添加上一期的结果来计算第 90 个百分位数,预计第 90 个百分位数的值会略有不同(下面是我想要得到的示例):

P01 ARBUTUS HOSPITAL    164.2
P02 (=P01+P02)  ARBUTUS HOSPITAL    165
P03(=P01+P02+P03)   ARBUTUS HOSPITAL    162
P04 (=P01+P02+P03+P04)  ARBUTUS HOSPITAL    163
P05(=P01+P02+P03+P04+P05)   ARBUTUS HOSPITAL    164

你能帮忙吗?谢谢!

附:我之前问过一个关于第 90 个百分位数计算的问题,但它与另一个问题有关。

【问题讨论】:

  • 尝试按时间段分组,然后聚合

标签: sql oracle percentile


【解决方案1】:

您应该将句点添加到您的分区中,然后使用 sum over。您的查询将如下所示:

SELECT distinct hospital, period, 
PERCENTILE_CONT(0.9) WITHIN GROUP (order by cumDays) OVER (PARTITION BY hospital, period) as percentile
from(
select t.hospital, t.period, t.wait_days, c.period cumPeriod, c.wait_days cumDays from mytable1 t
left outer join  mytable1 c on t.hospital = c.hospital and t.period >= c.period
) x

附言我没有访问 Oracle 数据库的权限,所以我尝试了 MSSQL 数据库,它成功了。

编辑:在 Natalia 的第一条评论之后,对答案进行了编辑以返回正确的结果。如果编辑后的查询现在返回正确的结果,请将此问题标记为已回答。

【讨论】:

  • 谢谢哈迪!是的,它确实计算了累积数字,但不幸的是,不能将第 90 个百分位相加,就像百分比一样 - 当我们计算累积值时,我们不能对百分比求和(因为体积它工作得很好)。
猜你喜欢
  • 2018-11-25
  • 2012-11-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多