简体   繁体   English

从审计表中获取多个条件的最新时间戳更新行

[英]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 112 A一种 1 1 10-OCT-2021 12.00.00.111111 2021 年 10 月 10 日 12.00.00.111111 User1用户 1 7 7 6 6
112 112 B 1 1 11-OCT-2021 12.00.00.111111 2021 年 10 月 11 日 12.00.00.111111 User1用户 1 7 7 6 6
112 112 A一种 2 2 11-OCT-2021 12.00.00.111111 2021 年 10 月 11 日 12.00.00.111111 User1用户 1 7 7 6 6
114 114 B 1 1 12-OCT-2021 12.00.00.111111 2021 年 10 月 12 日 12.00.00.111111 User1用户 1 7 7 6 6
112 112 A一种 2 2 13-OCT-2021 12.00.00.111111 2021 年 10 月 13 日 12.00.00.111111 User1用户 1 7 7 6 6
122 122 B 2 2 13-OCT-2021 12.00.00.111111 2021 年 10 月 13 日 12.00.00.111111 User1用户 1 7 7 6 6
122 122 A一种 5 5 13-OCT-2021 12.00.00.111111 2021 年 10 月 13 日 12.00.00.111111 User1用户 1 7 7 6 6
112 112 A一种 2 2 15-OCT-2021 12.00.00.111111 2021 年 10 月 15 日 12.00.00.111111 User1用户 1 7 7 6 6
114 114 B 3 3 16-OCT-2021 12.00.00.111111 2021 年 10 月 16 日 12.00.00.111111 User1用户 1 7 7 6 6
112 112 B 2 2 18-OCT-2021 12.00.00.111111 2021 年 10 月 18 日 12.00.00.111111 User1用户 1 7 7 6 6
112 112 A一种 1 1 10-OCT-2021 12.00.00.111111 2021 年 10 月 10 日 12.00.00.111111 User1用户 1 7 7 6 6
142 142 B 1 1 11-OCT-2021 12.00.00.111111 2021 年 10 月 11 日 12.00.00.111111 User1用户 1 7 7 6 6
102 102 A一种 2 2 11-OCT-2021 12.00.00.111111 2021 年 10 月 11 日 12.00.00.111111 User1用户 1 7 7 6 6
184 184 B 1 1 12-OCT-2021 12.00.00.111111 2021 年 10 月 12 日 12.00.00.111111 User1用户 1 7 7 6 6
142 142 D D 2 2 13-OCT-2021 12.00.00.111111 2021 年 10 月 13 日 12.00.00.111111 User1用户 1 7 7 6 6
118 118 C C 2 2 18-OCT-2021 12.00.00.111111 2021 年 10 月 18 日 12.00.00.111111 User1用户 1 7 7 6 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

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM