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

时间:2018-03-26 09:01:31

标签: sql oracle oracle11g

我在下面的表格中有一些测试数据

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它抛出错误。 感谢

1 个答案:

答案 0 :(得分: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