[英]Get latest timestamp updated rows for multiple criteria from audit table
I have an audit table that tracks the changes of the different tables along with the column_names, user, timestamp, oldvalue and the newvalue based on the Invoicenumber.我有一个审计表,它跟踪不同表的更改以及基于发票编号的 column_names、用户、时间戳、旧值和新值。 I need to retrieve latest audit data (last timestamp) across a specific set of tables and specific set of columns for a particular invoicenumber.
我需要在特定发票编号的一组特定表和一组特定列中检索最新审计数据(最后一个时间戳)。
Invoice_Number![]() |
Table_Name![]() |
Column_Name![]() |
Timestamp![]() |
User![]() |
Old_Value![]() |
New_Value![]() |
---|---|---|---|---|---|---|
112 ![]() |
A![]() |
1 ![]() |
10-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
112 ![]() |
B![]() |
1 ![]() |
11-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
112 ![]() |
A![]() |
2 ![]() |
11-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
114 ![]() |
B![]() |
1 ![]() |
12-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
112 ![]() |
A![]() |
2 ![]() |
13-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
122 ![]() |
B![]() |
2 ![]() |
13-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
122 ![]() |
A![]() |
5 ![]() |
13-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
112 ![]() |
A![]() |
2 ![]() |
15-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
114 ![]() |
B![]() |
3 ![]() |
16-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
112 ![]() |
B![]() |
2 ![]() |
18-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
112 ![]() |
A![]() |
1 ![]() |
10-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
142 ![]() |
B![]() |
1 ![]() |
11-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
102 ![]() |
A![]() |
2 ![]() |
11-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
184 ![]() |
B![]() |
1 ![]() |
12-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
142 ![]() |
D ![]() |
2 ![]() |
13-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
118 ![]() |
C ![]() |
2 ![]() |
18-OCT-2021 12.00.00.111111 ![]() |
User1![]() |
7 ![]() |
6 ![]() |
I need to get the last updated records for Invoice number 112 with changes made in (Table A & Column 1, 2) and changes made in (Table B & column 1,2).我需要获取发票编号 112 的最后更新记录,并在(表 A 和第 1、2 列)中进行更改并在(表 B 和第 1,2 列中进行了更改)。
I tried using rank, but I'm not sure how to expand it beyond one column.我尝试使用排名,但我不确定如何将其扩展到一列之外。
From Oracle 12, you can use MATCH_RECOGNIZE
:从 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
)
In earlier versions, you can use the ROW_NUMBER
analytic function:在早期版本中,您可以使用
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;
Note: since you only have a single invoice_number
you don't need to include it in the PARTITION BY
clause;注意:由于您只有一个
invoice_number
您无需将其包含在PARTITION BY
子句中; however, if you had multiple invoice_number
s then you would want to.但是,如果您有多个
invoice_number
那么您会想要。
Which, for the sample data:其中,对于样本数据:
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
Outputs:输出:
TABLE_NAME TABLE_NAME
COLUMN_NAME COLUMN_NAME
TIMESTAMP 时间戳
INVOICE_NUMBER 发票编号
USER 用户
OLD_VALUE OLD_VALUE
NEW_VALUE NEW_VALUE
A 一种
1 1
10-OCT-21 12.00.00.111111000 10-OCT-21 12.00.00.111111000
112 112
User1 用户 1
7 7
6 6
A 一种
2 2
15-OCT-21 12.00.00.111111000 15-OCT-21 12.00.00.111111000
112 112
User1 用户 1
7 7
6 6
B 乙
1 1
11-OCT-21 12.00.00.111111000 11-OCT-21 12.00.00.111111000
112 112
User1 用户 1
7 7
6 6
B 乙
2 2
18-OCT-21 12.00.00.111111000 18-OCT-21 12.00.00.111111000
112 112
User1 用户 1
7 7
6 6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.