Совокупные значения 90-го процентиля по периодам времени в Oracle SQL - PullRequest
0 голосов
/ 01 ноября 2018

Моя цель - рассчитать совокупные значения времени ожидания 90-го процентиля для пациентов, которые ожидали получения услуги в 3 больницах в течение 5 периодов.

Каждый период соответствует определенной временной шкале (например, период 1 (P01) означает, что пациент получал обслуживание в период с 1 апреля 2018 года по 3 мая 2018 года, период 2 (P02, обслуживание в период с 5 мая 2018 года по май) 31, 2018).

Мой оригинальный запрос очень сложен, и вот его упрощенная версия. Моя таблица состоит из 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;

Теперь я рассчитываю время ожидания 90-го процентиля, используя аналитическую версию без подзапроса Group By:

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

Не могли бы вы помочь? Спасибо!

P.S. Я уже задавал вопрос о вычислениях 90-го процентиля, но это было связано с другой проблемой.

1 Ответ

0 голосов
/ 01 ноября 2018

Вы должны добавить точку в свой раздел, а затем использовать сумму над. Ваш запрос будет выглядеть примерно так:

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

p.s. У меня не было доступа к БД Oracle, поэтому я попробовал на БД MSSQL, и это сработало.

РЕДАКТИРОВАТЬ: После первого комментария Натальи ответ был отредактирован, чтобы вернуть правильный результат. Пометьте этот вопрос как ответивший, если отредактированный запрос теперь возвращает правильный результат.

...