你可以使用:
SELECT Trans,
Inc,
"DATE",
CASE
WHEN rn < 26 THEN CHR(65 + rn)
WHEN rn < 27 * 26 THEN CHR(65 + MOD(FLOOR((rn-26)/POWER(26,1)),26))
|| CHR(65 + MOD(FLOOR((rn-26)/POWER(26,0)),26))
ELSE CHR(65 + MOD(FLOOR((rn-27*26)/POWER(26,2)),26))
|| CHR(65 + MOD(FLOOR((rn-27*26)/POWER(26,1)),26))
|| CHR(65 + MOD(FLOOR((rn-27*26)/POWER(26,0)),26))
END AS status
FROM (
SELECT Trans,
Inc,
"DATE",
ROW_NUMBER() OVER (PARTITION BY Inc ORDER BY "DATE") - 1 AS rn
FROM table_name t
);
其中,对于样本数据:
CREATE TABLE table_name (Trans, Inc, "DATE", Status) AS
SELECT 1, 1, DATE '2022-01-01', CAST(NULL AS VARCHAR2(3)) FROM DUAL UNION ALL
SELECT 5, 1, DATE '2022-01-20', CAST(NULL AS VARCHAR2(3)) FROM DUAL UNION ALL
SELECT 3, 1, DATE '2022-01-03', CAST(NULL AS VARCHAR2(3)) FROM DUAL UNION ALL
SELECT 11, 2, DATE '2022-01-01', CAST(NULL AS VARCHAR2(3)) FROM DUAL UNION ALL
SELECT 3, 2, DATE '2021-12-13', CAST(NULL AS VARCHAR2(3)) FROM DUAL;
这将为每个INC 值输出从A 到Z 然后AA 到ZZ 然后AAA 到ZZZ 的状态。
输出:
| TRANS |
INC |
DATE |
STATUS |
| 1 |
1 |
2022-01-01 00:00:00 |
A |
| 3 |
1 |
2022-01-03 00:00:00 |
B |
| 5 |
1 |
2022-01-20 00:00:00 |
C |
| 3 |
2 |
2021-12-13 00:00:00 |
A |
| 11 |
2 |
2022-01-01 00:00:00 |
B |
如果您想更新状态值,那么您可以MERGE 使用ROWID 伪列进行关联:
MERGE INTO table_name dst
USING (
SELECT ROWID AS rid,
CASE
WHEN rn < 26 THEN CHR(65 + rn)
WHEN rn < 27 * 26 THEN CHR(65 + MOD(FLOOR((rn-26)/POWER(26,1)),26))
|| CHR(65 + MOD(FLOOR((rn-26)/POWER(26,0)),26))
ELSE CHR(65 + MOD(FLOOR((rn-27*26)/POWER(26,2)),26))
|| CHR(65 + MOD(FLOOR((rn-27*26)/POWER(26,1)),26))
|| CHR(65 + MOD(FLOOR((rn-27*26)/POWER(26,0)),26))
END AS status
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY Inc ORDER BY "DATE") - 1 AS rn
FROM table_name t
)
) src
ON (src.rid = dst.ROWID)
WHEN MATCHED THEN
UPDATE
SET status = src.status;
db小提琴here