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

问题描述 投票:2回答:1

我在下面有一些测试数据

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 oracle11g
1个回答
0
投票

相同的查询工作正常的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

© www.soinside.com 2019 - 2024. All rights reserved.