我正在寻找一种从表中选择一组行的有效方法,对SET执行一些检查(如计数),然后移动到下一行行。
行选择的标准是获取两行中具有一列非空值的所有行。
例如,在下表中我有一个列" PACKAGE_ID"。第一条记录的ID为1A,接下来的两条记录没有任何ID - 表示它们是1A包的一部分。
在这个特定的例子中,我想获得3个不同的SETS
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 ║
╚═════════════════════════════════════════════════════════════════╝
我认为的一种方法是在CURSOR中使用LAG / LEAD函数并以顺序方式选择行,并且一旦发现下一个非空值,则在移动到下一行之前对先前的行执行操作。
但是,我想知道是否有更好的方法在SETS上执行逻辑而不是逐行?任何建议/方向都将非常感激。
答案 0 :(得分:1)
使用累计金额/计数来分配集合:
select t.*,
count(package_id) over (order by sort_sequence) as set_id
from t;
count()
计算每行之前的非NULL值的数量。这是您正在寻找的设置ID。