Аналитическая функция Oracle против MariaDB
В настоящее время мои запросы Oracle переносятся на MariaDB 10.4
У меня проблемы с аналитической функцией.
Код MARIADB:
select cgi, timestamp, hour, rat_type, dl_tput,
ntile(24) over (partition by timestamp,rat_type order by dl_tput) as dl_tput_ntiled
from (select cgi, date(timestamp) as timestamp,
date_format(timestamp,'%H') as hour, rat_type, avg(avg_mean_down) as dl_tput
from JUST_TEST_A
where avg_mean_down is not null
group by cgi, date(timestamp),date_format(timestamp,'%H'),rat_type
) x ;
Этот код работает нормально, но после проверки вывода результат Oracle отличается от результата MariaDB (те же данные)
В моем сценарии оракула есть этот сценарий, который я удалил в mariadb.
select cgi, timestamp, hour, rat_type, dl_tput,
ntile(24) over (partition by timestamp,rat_type order by dl_tput) as dl_tput_ntiled,
count(*) over () as dl_tput_cnt
from (...)
Делает count(*) over ()
влияет на мой вывод? Каков альтернативный запрос этой аналитической функции для MariaDB?
2 ответа
В этой ДЕМО здесь:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=be74a9fa9059d6b80a8cb10d102355d4
вы найдете небольшой пример, в котором я ввел некоторые данные и есть запрос:
select pk
, a
, b
, ntile(24) over (partition by a, b order by pk)
, count(*) over () as dl_tput_cnt
from t1;
В верхнем левом углу у вас есть список различных баз данных, из которых вы можете выбирать. Если вы выберете Oracle для этого примера или если вы выберете Maria DB, результат будет таким же. Это не гарантия того, чтоcount
а также ntile
не несут ответственности за ваши другие результаты, но, пожалуйста, расскажите нам об этих результатах подробнее:
но после проверки вывода результат Oracle отличается от результата MariaDB (те же данные)
Может быть, это больше поможет в вашем случае.
Еще кое-что.
Я думаю, вам следует проверить результаты, которые вы получаете от Maria DB для этого запроса:
SELECT date(timestamp) FROM JUST_TEST_A
SELECT date_format(timestamp,'%H') FROM JUST_TEST_A
и сравните их со старыми результатами, полученными от Oracle для эквивалентных функций Oracle для date и date_format.
Подозреваю, что это проблема со связями. ntile()
разделит строки с одними и теми же группами по разным сегментам, потому что его задача состоит в том, чтобы все сегменты имели одинаковый размер.
В качестве крайнего примера, если все значения dl_tput
были одинаковыми, то можно было присвоить любое значение от 1 до 24.