选择PL/SQL中两个非空列值之间的行集

选择PL/SQL中两个非空列值之间的行集,sql,oracle,Sql,Oracle,我正在寻找一种有效的方法,从表中选择一组行,对该组行执行一些检查(如计数),然后移动到下一组行 行选择的标准是获取在一列中具有非空值的两行之间的所有行 例如,在下表中,我有一列“PACKAGE_ID”。第一个记录的ID为1A,接下来的两个记录没有任何ID-表示它们是1A包的一部分 在这个特殊的例子中,我想得到3个不同的集合 1st set : PRODUCT ID 34, 23, 14 2nd set : PRODUCT ID 48 3rd set : PRODUCT ID 75, 11 ╔══

我正在寻找一种有效的方法,从表中选择一组行,对该组行执行一些检查(如计数),然后移动到下一组行

行选择的标准是获取在一列中具有非空值的两行之间的所有行

例如,在下表中,我有一列“PACKAGE_ID”。第一个记录的ID为1A,接下来的两个记录没有任何ID-表示它们是1A包的一部分

在这个特殊的例子中,我想得到3个不同的集合

1st set : PRODUCT ID 34, 23, 14
2nd set : PRODUCT ID 48
3rd set : PRODUCT ID 75, 11
╔═════════════════════════════════════════════════════════════════╗
║ PRODUCT_ID             PACKAGE_ID       SORT_SEQUENCE           ║
╠═════════════════════════════════════════════════════════════════╣
║ ---------------------- ----------       ----------------------  ║
║ 34                     1A               1001                    ║
║ 23                     (null)           1002                    ║
║ 14                     (null)           1003                    ║
║ 48                     2B               1004                    ║
║ 75                     3C               1005                    ║
║ 11                     (null)           1006                    ║
╚═════════════════════════════════════════════════════════════════╝
我认为的一种方法是在游标中使用滞后/超前函数,并以顺序方式选择行,一旦发现下一个非空值,在移动到下一个行之前对前一行执行该操作


然而,我想知道是否有更好的方法在集合上执行逻辑,而不是逐行执行?如果您有任何建议/指示,我们将不胜感激。

使用累计总和/计数来分配集合:

select t.*,
       count(package_id) over (order by sort_sequence) as set_id
from t;

count()。这就是您正在寻找的集合id。

Gordon已经为您的通用问题陈述提供了一个高效的通用解决方案。您在组的行上执行的“操作”是什么,Oracle版本是什么(如
select*from v$version
所报告的)。例如,12.1版中引入的
match\u recognize
子句可能会快速执行行操作,甚至比解析函数解更快。(但仅适用于Oracle 12.1及更高版本!)不,我使用的是Oracle 10g,因此无法使用更高版本中引入的任何内容。我需要根据集合对其中一个列进行求和,然后根据某些规则将它们分组为单个包。是的,我可以根据这些集合ID构建逻辑。谢谢戈登!