Sql 基于同一表中的列生成Oracle序列
我正在尝试使用oracle中的分析函数生成序列。但是,我的序列依赖于表PROD_INFO中的两列。列名为PROD_ID和BILLING_NO。对于同一PROD_ID,可以有多个BILLING_NO。BILLING_NO也可以有空值。我需要根据以下逻辑生成序列Sql 基于同一表中的列生成Oracle序列,sql,oracle,sequence,Sql,Oracle,Sequence,我正在尝试使用oracle中的分析函数生成序列。但是,我的序列依赖于表PROD_INFO中的两列。列名为PROD_ID和BILLING_NO。对于同一PROD_ID,可以有多个BILLING_NO。BILLING_NO也可以有空值。我需要根据以下逻辑生成序列 对于第一组PROD_ID,BILLING_NO composition,我需要增加2000、2010、2020等序列,直到找到具有相同PROD_ID的不同BILLING_NO 如果是不同的账单号,我需要输入3000、3010、3020等序列
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;
所以,你能帮我实现上述结果吗
谢谢大家!
--The query you need
SELECT PROD_ID,
BILLING_NO,
(DENSE_RANK() OVER (PARTITION BY prod_id ORDER BY PROD_ID, BILLING_NO) + 1) * 1000
+
ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS sequence,
QUANTITY
FROM PROD_INFO
/
您需要使用ANALYTIC
函数densite\u RANK
和ROW\u NUMBER
让我们用一个测试用例来检查这一点
SQL> WITH DATA AS(
2 SELECT '1-7OR' PROD_ID, 'AB1' BILLING_NO FROM DUAL UNION ALL
3 SELECT '1-7OR' PROD_ID, 'AB1' BILLING_NO FROM DUAL UNION ALL
4 SELECT '1-7OR' PROD_ID, 'AB1' BILLING_NO FROM DUAL UNION ALL
5 SELECT '1-7OR' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
6 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
7 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
8 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
9 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
10 SELECT '1-7OR' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
11 SELECT '1-7OR' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
12 SELECT '1-7OR' PROD_ID, 'AB3' BILLING_NO FROM DUAL UNION ALL
13 SELECT '1-7OR' PROD_ID, 'AB3' BILLING_NO FROM DUAL UNION ALL
14 SELECT '1-7OR' PROD_ID, 'AB3' BILLING_NO FROM DUAL UNION ALL
15 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
16 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
17 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
18 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
19 SELECT '1-9ER' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
20 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL UNION ALL
21 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL UNION ALL
22 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL UNION ALL
23 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL
24 )
25 --The query you need
26 SELECT PROD_ID,
27 BILLING_NO,
28 (DENSE_RANK() OVER (PARTITION BY prod_id ORDER BY PROD_ID, BILLING_NO) + 1) * 1000
29 +
30 ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS sequence
31 FROM data
32 /
PROD_ BIL SEQUENCE
----- --- --------------------
1-7OR AB1 2010
1-7OR AB1 2020
1-7OR AB1 2030
1-7OR AB2 3010
1-7OR AB2 3020
1-7OR AB2 3030
1-7OR AB2 3040
1-7OR AB3 4010
1-7OR AB3 4020
1-7OR AB3 4030
1-7OR 5010
1-7OR 5020
1-7OR 5030
1-9ER UC1 2010
1-9ER UC1 2020
1-9ER UC1 2030
1-9ER UC1 2040
1-9ER UC2 3010
1-9ER UC2 3020
1-9ER UC2 3030
1-9ER UC2 3040
1-9ER 4010
22 rows selected.
SQL>
注意窗口功能将所有空值保持在一起。问得好。您需要使用
analytic
函数densite\u rank
和row\u number
。检查我的答案。太棒了,谢谢!我只是稍微调整了一下你的答案,从2000年开始。选择产品标识,账单号,(密集等级()覆盖(按产品标识按订单划分,账单号)+1)*1000+(行号()覆盖(按产品标识划分,按账单号划分)*10)-10作为序列,数量来自产品信息;啊,是的,我没有意识到我的解决方案的顺序是从2010
开始,而不是从2000
开始。感谢您的反馈:-)
SQL> WITH DATA AS(
2 SELECT '1-7OR' PROD_ID, 'AB1' BILLING_NO FROM DUAL UNION ALL
3 SELECT '1-7OR' PROD_ID, 'AB1' BILLING_NO FROM DUAL UNION ALL
4 SELECT '1-7OR' PROD_ID, 'AB1' BILLING_NO FROM DUAL UNION ALL
5 SELECT '1-7OR' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
6 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
7 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
8 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
9 SELECT '1-7OR' PROD_ID, 'AB2' BILLING_NO FROM DUAL UNION ALL
10 SELECT '1-7OR' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
11 SELECT '1-7OR' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
12 SELECT '1-7OR' PROD_ID, 'AB3' BILLING_NO FROM DUAL UNION ALL
13 SELECT '1-7OR' PROD_ID, 'AB3' BILLING_NO FROM DUAL UNION ALL
14 SELECT '1-7OR' PROD_ID, 'AB3' BILLING_NO FROM DUAL UNION ALL
15 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
16 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
17 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
18 SELECT '1-9ER' PROD_ID, 'UC1' BILLING_NO FROM DUAL UNION ALL
19 SELECT '1-9ER' PROD_ID, NULL BILLING_NO FROM DUAL UNION ALL
20 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL UNION ALL
21 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL UNION ALL
22 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL UNION ALL
23 SELECT '1-9ER' PROD_ID, 'UC2' BILLING_NO FROM DUAL
24 )
25 --The query you need
26 SELECT PROD_ID,
27 BILLING_NO,
28 (DENSE_RANK() OVER (PARTITION BY prod_id ORDER BY PROD_ID, BILLING_NO) + 1) * 1000
29 +
30 ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS sequence
31 FROM data
32 /
PROD_ BIL SEQUENCE
----- --- --------------------
1-7OR AB1 2010
1-7OR AB1 2020
1-7OR AB1 2030
1-7OR AB2 3010
1-7OR AB2 3020
1-7OR AB2 3030
1-7OR AB2 3040
1-7OR AB3 4010
1-7OR AB3 4020
1-7OR AB3 4030
1-7OR 5010
1-7OR 5020
1-7OR 5030
1-9ER UC1 2010
1-9ER UC1 2020
1-9ER UC1 2030
1-9ER UC1 2040
1-9ER UC2 3010
1-9ER UC2 3020
1-9ER UC2 3030
1-9ER UC2 3040
1-9ER 4010
22 rows selected.
SQL>