从 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 |
TIMESTAMP |
INVOICE_NUMBER |
USER |
OLD_VALUE |
NEW_VALUE |
| A |
1 |
10-OCT-21 12.00.00.111111000 |
112 |
User1 |
7 |
6 |
| A |
2 |
15-OCT-21 12.00.00.111111000 |
112 |
User1 |
7 |
6 |
| B |
1 |
11-OCT-21 12.00.00.111111000 |
112 |
User1 |
7 |
6 |
| B |
2 |
18-OCT-21 12.00.00.111111000 |
112 |
User1 |
7 |
6 |
db小提琴here