Как эмулировать агрегированную функцию PERCENTILE_DIS C Oracle в MariaDB? - PullRequest
0 голосов
/ 07 августа 2020

Я работаю над миграцией с Oracle DB на MariaDB, и у меня есть такой запрос (в Oracle):

SELECT NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION), 
PERCENTILE_DISC(0.95) WITHIN GROUP (ORDER BY DURATION ASC) 
FROM SOME_TABLES WHERE [SOME CONDITIONS] 
GROUP BY NAME, DATE, HOUR_OF_DAY

Итак, я создал этот для MariaDB:

SELECT NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION), 
PERCENTILE_DISC(0.95) WITHIN GROUP (ORDER BY DURATION ASC)  OVER() 
FROM SOME_TABLES WHERE [SOME CONDITIONS] 
GROUP BY NAME, DATE, HOUR_OF_DAY

Поскольку я видел, что предложение OVER является обязательным в MariaDB, но похоже, что это немного сложнее, поэтому я нашел эту статью и, согласно этому, эквивалент в MariaDB будет примерно таким:

SELECT NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION), 
MAX(t.x2) AS PERCENTILE 
FROM SOME_TABLES, (
SELECT NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION),
FIRST_VALUE(DURATION) OVER( PARTITION BY NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION) 
ORDER BY CASE WHEN p2<=0.95 THEN p2 END ASC NULLS LAST) AS x2
FROM(
SELECT NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION),
PERCENT_RANK() OVER (
PARTITION BY NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION) 
ORDER BY NAME, DATE, HOUR_OF_DAY, COUNT(*), AVG(DURATION)) AS p2
FROM SOME_TABLES
) t
)t  WHERE [SOME CONDITIONS] 
GROUP BY NAME, DATE, HOUR_OF_DAY

Итак, это единственный способ эмулировать этот запрос в MariaDB? почему у нас нет функции PERCENTILE_DIS C в эквивалентном запросе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...