选择PL/SQL中两个非空列值之间的行集
我正在寻找一种有效的方法,从表中选择一组行,对该组行执行一些检查(如计数),然后移动到下一组行 行选择的标准是获取在一列中具有非空值的两行之间的所有行 例如,在下表中,我有一列“PACKAGE_ID”。第一个记录的ID为1A,接下来的两个记录没有任何ID-表示它们是1A包的一部分 在这个特殊的例子中,我想得到3个不同的集合选择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 ╔══
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构建逻辑。谢谢戈登!