我有以下格式的数据:
Tran No Date Store ID Register ID Tender
01 23-10-2015 1000 001 CASH
01 23-10-2015 1000 001 CRDT
02 23-10-2015 1000 001 CASH
02 23-10-2015 1000 001 GIFT
表中已添加新列 (Tran Seq)
这样新数据就会变成这样
Tran No Date Store ID Register ID Tender Tran Seq
01 23-10-2015 1000 001 CASH 0
01 23-10-2015 1000 001 CRDT 1
02 23-10-2015 1000 001 CASH 0
02 23-10-2015 1000 001 GIFT 1
对于每个相同的 TRAN NO、DATE、STORE ID 和 REGISTER ID,每个行项目都会在 Tran Seq 字段中获得一个新的序列号。
如何实现上述结果?
最佳答案
您可以使用ROW_NUMBER()分析函数:
例如,
设置
CREATE TABLE t
(tran_no NUMBER,
"DATE" VARCHAR2(10),
store_id NUMBER,
Register_ID NUMBER,
Tender varchar2(4));
INSERT ALL
INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
VALUES (01, '23-10-2015', 1000, 001, 'CASH')
INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
VALUES (01, '23-10-2015', 1000, 001, 'CRDT')
INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
VALUES (02, '23-10-2015', 1000, 001, 'CASH')
INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
VALUES (02, '23-10-2015', 1000, 001, 'GIFT')
INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
VALUES (02, '23-10-2015', 1000, 001, 'CRDT')
SELECT * FROM dual;
查询
SQL> SELECT t.*,
2 row_number() OVER(PARTITION BY tran_no,
3 "DATE",
4 store_id,
5 register_id
6 ORDER BY tender) - 1 tran_seq
7 FROM t;
TRAN_NO DATE STORE_ID REGISTER_ID TEND TRAN_SEQ
---------- ---------- ---------- ----------- ---- ----------
1 23-10-2015 1000 1 CASH 0
1 23-10-2015 1000 1 CRDT 1
2 23-10-2015 1000 1 CASH 0
2 23-10-2015 1000 1 CRDT 1
2 23-10-2015 1000 1 GIFT 2
SQL>
注意:
列名称之间不能有空格。我用下划线代替。
您不能使用 Oracle 关键字。如果要使用,那么就需要使用双引号。例如,“日期”列。请记住,您需要在引用的所有地方使用双引号。
来自 Database Object Naming Rules 的文档:
A quoted identifier begins and ends with double quotation marks ("). If you name a schema object using a quoted identifier, then you must use the double quotation marks whenever you refer to that object.
更新
OP 希望使用生成的序列更新新列。您可以使用MERGE语句。
SQL> ALTER TABLE t ADD tran_seq NUMBER;
Table altered.
SQL> MERGE INTO t
2 USING(
3 SELECT TRAN_NO, "DATE", STORE_ID, REGISTER_ID, TENDER,
4 row_number() OVER(PARTITION BY tran_no,
5 "DATE",
6 store_id,
7 register_id
8 ORDER BY tender) - 1 tran_seq
9 FROM t
10 ) s
11 ON (t.tran_no = s.tran_no
12 AND t."DATE" = s."DATE"
13 AND t.store_id = s.store_id
14 AND t.register_id = s.register_id
15 AND t.tender = s.tender
16 )
17 WHEN MATCHED THEN
18 UPDATE SET t.tran_seq = s.tran_seq
19 /
5 rows merged.
SQL> SELECT * FROM t ORDER BY tran_no, tran_seq;
TRAN_NO DATE STORE_ID REGISTER_ID TEND TRAN_SEQ
---------- ---------- ---------- ----------- ---- ----------
1 23-10-2015 1000 1 CASH 0
1 23-10-2015 1000 1 CRDT 1
2 23-10-2015 1000 1 CASH 0
2 23-10-2015 1000 1 CRDT 1
2 23-10-2015 1000 1 GIFT 2
关于sql - 列更新 Oracle SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603653/