【发布时间】:2014-10-31 13:26:19
【问题描述】:
我正在尝试使用 oracle 中的分析功能生成序列。但是,我的序列取决于表 PROD_INFO 中的两列。列名是 PROD_ID 和 BILLING_NO。对于同一个 PROD_ID,可以有多个 BILLING_NO。 BILLING_NO 也可以有 NULL 值。我需要根据以下逻辑生成 SEQUENCE。
- 对于第一组 PROD_ID、BILLING_NO 组合,我需要增加 SEQUENCE,如 2000、2010、2020 等,直到找到具有相同 PROD_ID 的不同 BILLING_NO。
- 如果是不同的BILLING_NO,我需要输入序列为3000、3010、3020等
- 当 PROD_ID 更改时,我需要将 BILLING_NO 的序列更改为 2000、2010、2020 等。输出显示在下表中。
PROD_ID BILLING_NO SEQUENCE QUANTITY
1-7OR AB1 2000 80
1-7OR AB1 2010 2
1-7OR AB1 2020 30
1-7OR NULL 2030 10
1-7OR AB2 3000 15
1-7OR AB2 3010 15
1-7OR AB2 3020 15
1-7OR AB2 3030 15
1-7OR NULL 3040 15
1-7OR NULL 3050 15
1-7OR AB3 4000 15
1-7OR AB3 4010 15
1-7OR AB3 4020 15
1-9ER UC1 2000 50
1-9ER UC1 2010 90
1-9ER UC1 2020 35
1-9ER UC1 2030 63
1-9ER NULL 2040 41
1-9ER UC2 3000 75
1-9ER UC2 3010 75
1-9ER UC2 3020 90
1-9ER UC2 3030 90
P.S:我在上面的输出中用 'NULL' 描述了 NULL 值。
我目前正在使用以下分析函数。但是它不会更改为 3000、3010 等、4000、4010 等,而是重复 2000、2010、2020 等。
SELECT PROD_ID,
BILLING_NO,
2000 + ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS SEQUENCE,
QUANTITY
FROM PROD_INFO;
那么,请您帮我实现上述结果。
谢谢!
【问题讨论】:
-
好问题。您需要使用
analytic函数dense_rank和row_number。检查我的答案。