Sql 不带子查询或子表的分析函数结果筛选

Sql 不带子查询或子表的分析函数结果筛选,sql,oracle,oracle11g,oracle10g,netsuite,Sql,Oracle,Oracle11g,Oracle10g,Netsuite,我正在从事Netsuite项目,它的SQL功能有限。这很难测试,因为我基本上是猜测他们在GUI中构建的SQL 我想将查询结果过滤为文化和为负值的结果 以下是一个有效的PL/SQL构造,可以防止任何小的语法错误吗 SELECT SUM(amount) OVER(PARTITION BY itemid ORDER BY date ROWS UNBOUNDED PRECEDING) AS "sum" FROM table WHERE sum < 0 其次,由于Netsuite的限制,

我正在从事Netsuite项目,它的SQL功能有限。这很难测试,因为我基本上是猜测他们在GUI中构建的SQL

我想将查询结果过滤为文化和为负值的结果

以下是一个有效的PL/SQL构造,可以防止任何小的语法错误吗

 SELECT SUM(amount) OVER(PARTITION BY itemid ORDER BY date ROWS UNBOUNDED
    PRECEDING) AS "sum" FROM table WHERE sum < 0
其次,由于Netsuite的限制,以下构造是否有效

 SELECT SUM(amount) OVER(PARTITION BY itemid ORDER BY date ROWS UNBOUNDED 
    PRECEDING) AS "sum" FROM table WHERE SUM(amount) OVER(PARTITION BY itemid
    ORDER BY date ROWS UNBOUNDED PRECEDING) < 0

甲骨文的文档表明,这两种方法都是无效的,过滤分析功能应该通过子查询完成,但一些谷歌集团和其他网站提出了不同的建议。然而,大多数示例中使用的是秩函数和稠密秩函数,它们的功能可能不同。

要过滤分析函数的结果,必须在from子句中使用内联视图子查询

例如,您的查询可能如下所示:

select  *
from    (
            select  itemid,
                    date,
                    sum(amount) over (
                                        partition by itemid
                                        order by date
                                        rows between unbounded preceding
                                                 and current row
                                     ) as run_sum
            from    table
        )
where   run_sum < 0

这将显示所有项目以及相关日期,如果给定项目存在任何此类日期,则该项目的运行总和小于零。

在WHERE子句中不能使用聚合函数。别名也不能。对于别名,只需在子查询中执行此操作或重复整个操作-最好不要,而对于SUMamount的筛选,只需将记录分组并将其放入HAVING子句中。您不能使用WHERE或HAVING筛选分析函数的结果,因为它是在聚合/HAVING之后计算的,你必须把它放在一个派生表中。但一些谷歌集团和其他网站提出了不同的建议——如果他们真的这么说,那他们就错了。