1

目前正在将我的 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 的替代查询是什么?

4

2 回答 2

0

我怀疑这是关系的问题。 ntile()将在不同的存储桶中拆分具有相同组的行,因为它的任务是每个存储桶的大小相同。

作为一个极端的例子,如果 的所有值dl_tput都相同,则可以分配从 1 到 24 的任何值。

于 2020-01-16T17:31:15.800 回答
0

在此演示中:

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 等效函数。

于 2020-01-16T18:08:29.203 回答