Аналитическая функция Oracle против MariaDB - PullRequest
1 голос
/ 16 января 2020

В настоящее время выполняю миграцию моих 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 (те же данные)

Мой oracle сценарий содержит этот сценарий, который я удалил в 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 ]

0 голосов
/ 16 января 2020

В этой демонстрационной версии здесь:

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_format.

0 голосов
/ 16 января 2020

Я подозреваю, что это проблема со связями. ntile() будет разбивать строки с одинаковыми группами по разным сегментам, поскольку его мандат для каждого сегмента должен быть одинакового размера.

В качестве крайнего примера, если все значения dl_tput были бы одинаковыми, тогда может быть присвоено любое значение от 1 до 24.

...