Я работаю над миграцией с 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 в эквивалентном запросе?