在没有子查询或子表的情况下按解析函数结果过滤
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
这将显示所有项目和相关日期,在该日期该项目的 运行 总和小于零(如果给定项目有任何此类日期)。
我正在从事 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
这将显示所有项目和相关日期,在该日期该项目的 运行 总和小于零(如果给定项目有任何此类日期)。