在Oracle中使用NTILE和动态查询结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Oracle中使用NTILE和动态查询结果相关的知识,希望对你有一定的参考价值。

我在下面有一些测试数据

create table TestTable
(  
  torque number,
  torqueValues number
)

insert into TestTable values(1,10);
insert into TestTable values(1,20);
insert into TestTable values(1,30);
insert into TestTable values(2,1);
insert into TestTable values(3,2);
insert into TestTable values(5,10);
insert into TestTable values(9,1);
insert into TestTable values(9,12);
insert into TestTable values(10,15);
insert into TestTable values(10,10);

我试图在oracle中应用NTILE并将记录集分成多个组。当我在下面运行查询它的工作正常。

select torque,NTILE(2) over(order by torque)  from TestTable

但是当我试图将动态值传递给NTILE时,它会丢失表达式错误。下面是查询

select torque,
NTILE(  
  select count(*)/2 as countvalue from TestTable
over(order by torque)  from TestTable

你能指出我弄错了吗?相同的查询工作正常的SQL服务器但oracle它抛出错误。谢谢

答案

相同的查询工作正常的SQL服务器但oracle它抛出错误。

不,它也在SQL Server中出错:Check This

在Oracle中使用with子句尝试这个,它可以工作。

WITH t
AS (
    SELECT count(*) / 2 AS countvalue
    FROM TestTable
    )
SELECT torque
    ,NTILE(countvalue) OVER (
        PARTITION BY countvalue ORDER BY torque
        ) as tile
FROM TestTable
CROSS JOIN t;

Demo

这里要注意的一点是需要PARTITION BY countvalue,否则会抛出此错误。

ORA-30488描述:参数应该是PARTITION BY中表达式的函数

我仍然无法从Oracle文档或其他任何地方获得上述限制的适当来源。至于SQL Server,即使这似乎也不起作用:Check this

以上是关于在Oracle中使用NTILE和动态查询结果的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 11g 中转换动态查询以使用绑定变量

hive窗口函数使用详解

oracle将查询的结果值作为下一个查询的字段列。

oracle数据库怎样查询用变量表示的字段名?

Oracle分析函数-排序排列(rankdense_rankrow_number)

oracle游标的使用