在没有子查询或子表的情况下按解析函数结果过滤

Filtering by analytic function results without subquery or subtable

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

我想将查询结果过滤为累计和为负值的结果。

以下是否是有效的 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

Oracle 的文档表明这些都无效,过滤分析函数应该通过子查询完成,但一些 google 组和其他网站建议不这样做。然而,大多数人在他们的示例中使用 RANK() 和 DENSE_RANK() 函数,它们的功能可能不同。

要过滤分析函数的结果,您必须使用内联视图(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

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