我們有一個審計表,它跟蹤不同表的更改以及基于發票編號的 column_names、user、timestamp、oldvalue 和 newvalue。我需要在特定發票編號的一組特定表和一組特定列中檢索最新審計資料(最后一個時間戳)。
| 發票編號 | 表名 | 列名 | 時間戳 | 用戶 | 舊值 | 新值 |
|---|---|---|---|---|---|---|
| 112 | 一種 | 1 | 2021 年 10 月 10 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 112 | 乙 | 1 | 2021 年 10 月 11 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 112 | 一種 | 2 | 2021 年 10 月 11 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 114 | 乙 | 1 | 2021 年 10 月 12 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 112 | 一種 | 2 | 2021 年 10 月 13 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 122 | 乙 | 2 | 2021 年 10 月 13 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 122 | 一種 | 5 | 2021 年 10 月 13 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 112 | 一種 | 2 | 2021 年 10 月 15 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 114 | 乙 | 3 | 2021 年 10 月 16 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 112 | 乙 | 2 | 2021 年 10 月 18 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 112 | 一種 | 1 | 2021 年 10 月 10 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 142 | 乙 | 1 | 2021 年 10 月 11 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 102 | 一種 | 2 | 2021 年 10 月 11 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 184 | 乙 | 1 | 2021 年 10 月 12 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 142 | D | 2 | 2021 年 10 月 13 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
| 118 | C | 2 | 2021 年 10 月 18 日 12.00.00.111111 | 用戶 1 | 7 | 6 |
現在,我需要獲取發票編號 112 的最后更新記錄,并在(表 A 和第 1、2 列)中進行更改并在(表 B 和第 1,2 列中進行了更改)。
我嘗試使用 rank 但不確定如何將其擴展到一列之外。
uj5u.com熱心網友回復:
從 Oracle 12 開始,您可以使用MATCH_RECOGNIZE:
SELECT *
FROM (
SELECT *
FROM table_name
WHERE invoice_number = 112
AND table_name IN ('A', 'B')
AND column_name IN (1, 2)
)
MATCH_RECOGNIZE (
PARTITION BY /*invoice_number,*/ table_name, column_name
ORDER BY timestamp DESC
ALL ROWS PER MATCH
PATTERN (^ last_row)
DEFINE last_row AS 1 = 1
)
在早期版本中,您可以使用ROW_NUMBER決議函式:
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY /*invoice_number,*/ table_name, column_name
ORDER BY timestamp DESC
) AS rn
FROM table_name t
WHERE invoice_number = 112
AND table_name IN ('A', 'B')
AND column_name IN (1, 2)
)
WHERE rn = 1;
注意:由于您只有一個,因此invoice_number您無需將其包含在PARTITION BY子句中;但是,如果你有多個invoice_numbers 那么你會想要。
其中,對于樣本資料:
CREATE TABLE table_name (Invoice_Number, Table_Name, Column_Name, Timestamp, "USER", Old_Value, New_Value) AS
SELECT 112, 'A', 1, TIMESTAMP '2021-10-10 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 112, 'B', 1, TIMESTAMP '2021-10-11 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 112, 'A', 2, TIMESTAMP '2021-10-11 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 114, 'B', 1, TIMESTAMP '2021-10-12 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 112, 'A', 2, TIMESTAMP '2021-10-13 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 122, 'B', 2, TIMESTAMP '2021-10-13 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 122, 'A', 5, TIMESTAMP '2021-10-13 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 112, 'A', 2, TIMESTAMP '2021-10-15 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 114, 'B', 3, TIMESTAMP '2021-10-16 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 112, 'B', 2, TIMESTAMP '2021-10-18 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 112, 'A', 1, TIMESTAMP '2021-10-10 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 142, 'B', 1, TIMESTAMP '2021-10-11 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 102, 'A', 2, TIMESTAMP '2021-10-11 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 184, 'B', 1, TIMESTAMP '2021-10-12 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 142, 'D', 2, TIMESTAMP '2021-10-13 12:00:00.111111', 'User1', 7, 6 FROM DUAL UNION ALL
SELECT 118, 'C', 2, TIMESTAMP '2021-10-18 12:00:00.111111', 'User1', 7, 6 FROM DUAL
輸出:
TABLE_NAME COLUMN_NAME 時間戳 發票編號 用戶 OLD_VALUE NEW_VALUE 一種 1 10-OCT-21 12.00.00.111111000 112 用戶 1 7 6 一種 2 15-OCT-21 12.00.00.111111000 112 用戶 1 7 6 乙 1 11-OCT-21 12.00.00.111111000 112 用戶 1 7 6 乙 2 18-OCT-21 12.00.00.111111000 112 用戶 1 7 6
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/358081.html
上一篇:從表格中讀取時只考慮少數幾個元素
下一篇:提交到資料庫表的表格
