表格1:
|Trans|Inc|Date|Status|
-----------------------
|1|1|01/01/2022|null
|5|1|20/01/2022|null
|3|1|03/01/2022|null
|11|2|01/01/2022|null
|3|2|13/12/2021|null
結果應該是
|Trans|Inc|Date|Status|
-----------------------
|1|1|01/01/2022|A
|5|1|20/01/2022|C
|3|1|03/01/2022|B
|11|2|01/01/2022|B
|3|2|13/12/2021|A
邏輯:表 1 有 4 列,狀態列應按以下條款更新:1 Inc 可以附加多個 trans。所以狀態應該根據日期列更新。前任。對于 Inc 1,我們有 4 個 trans(所以會有狀態 A、B、C、D)和 Tran 1 日期 01/01/2022 所以狀態是“A”,第二條記錄是 inc 1 tran 3,日期是 03 /01/2022,所以狀態是 B。基本上我們需要根據日期列按字母順序分配狀態。
為此需要幫助。
uj5u.com熱心網友回復:
你可以ROW_NUMBER在這里使用:
SELECT Trans, Inc, Date,
SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
ROW_NUMBER() OVER (PARTITION BY Inc ORDER BY Date), 1) AS Status
FROM yourTable;
這里的技巧是根據每組公司記錄中每條記錄的行號位置來獲取字母的 1 子字串。
uj5u.com熱心網友回復:
您可以使用:
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;
這將為每個值輸出從A到Z然后AA到再到ZZ再到的狀態。AAAZZZINC
輸出:
反式 INC 日期 地位 1 1 2022-01-01 00:00:00 一個 3 1 2022-01-03 00:00:00 乙 5 1 2022-01-20 00:00:00 C 3 2 2021-12-13 00:00:00 一個 11 2 2022-01-01 00:00:00 乙
如果要更新狀態值,則可以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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415961.html
標籤:
上一篇:從左到右獲取數字
