PL / SQL

时间:2017-09-08 02:04:45

标签: sql oracle

我正在寻找一种从表中选择一组行的有效方法,对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上执行逻辑而不是逐行?任何建议/方向都将非常感激。

1 个答案:

答案 0 :(得分:1)

使用累计金额/计数来分配集合:

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

count()计算每行之前的非NULL值的数量。这是您正在寻找的设置ID。