首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取最新变化的信息

获取最新变化的信息
EN

Stack Overflow用户
提问于 2020-05-11 11:22:53
回答 1查看 32关注 0票数 1

我有一张有很多信息的审计表。我需要知道什么时候和谁对每个项目的特定列进行了最新的更改。

我能够执行返回适当结果的查询,但我发现它是一个巨大的混乱。特别是因为我需要对许多不同的专栏(我可能会使用union)来完成这个任务,并将这些值与最新发布的值进行比较。不管怎样..。有比做3级选择更好的方法吗?

代码语言:javascript
复制
create table Z_AUDIT
(
  v CHAR(1) not null,      -- A value that is part of a project (ex: project manager)
  t DATE not null,         -- Time of change
  w VARCHAR2(10) not null, -- Who did the change
  p VARCHAR2(10)           -- Project
)

INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'a', sysdate, 'bob');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'a', sysdate-1, 'judy');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'a', sysdate-2, 'bob');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'b', sysdate-3, 'judy');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'b', sysdate-4, 'bob');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'a', sysdate-5, 'judy');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'a', sysdate-6, 'bob');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'b', sysdate-7, 'judy');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 1', 'c', sysdate-8, 'bob');

INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 2', 'b', sysdate, 'bob');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 2', 'a', sysdate-1, 'judy');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 2', 'a', sysdate-2, 'bob');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 2', 'b', sysdate-3, 'judy');
INSERT INTO Z_AUDIT (p, v, t, w) VALUES ('project 2', 'c', sysdate-4, 'bob');

 -- Get the latest change from the rank 1
 select p, w, t, current_value, previous_value
   from ( -- Get only the changes with the where clause and get the rank
         select i.p,
                 i.w,
                 i.t,
                 i.current_value,
                 i.previous_value,
                 rank() over(partition by i.p order by i.t desc) r
           from ( -- Get the previous value for each audit record
                  select p,
                          w,
                          t,
                          v as current_value,
                          LAG(v, 1) OVER(partition by p ORDER BY t) as previous_value
                    from Z_AUDIT) i
          where nvl(current_value, 'a') <> nvl(previous_value, 'a'))
  where r = 1;

项目1,bob,5/9/2020 7:08:55上午,a,b 项目2,鲍勃,2020年11月5日7:12:39,b,a

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 12:12:47

有几种更简单的方法来写这篇文章。注我使用CTE编写了这两篇文章,因为它们更容易阅读(IMO)。您可以使用FIRST_VALUE

代码语言:javascript
复制
WITH cp AS (
  SELECT p, w, t, v AS curr,
         LAG(v, 1, '') OVER (PARTITION BY p ORDER BY t) AS prev
  FROM Z_AUDIT
)
SELECT DISTINCT p,
       FIRST_VALUE(w) OVER (PARTITION BY p ORDER BY t DESC) AS w,
       FIRST_VALUE(t) OVER (PARTITION BY p ORDER BY t DESC) AS t,
       FIRST_VALUE(curr) OVER (PARTITION BY p ORDER BY t DESC) AS curr,
       FIRST_VALUE(prev) OVER (PARTITION BY p ORDER BY t DESC) AS prev
FROM cp
WHERE curr != prev

或甲骨文特定的KEEP ... FIRST

代码语言:javascript
复制
WITH cp AS (
  SELECT p, w, t, v AS curr,
         LAG(v, 1, '') OVER (PARTITION BY p ORDER BY t) AS prev
  FROM Z_AUDIT
)
SELECT p,
       MIN(w) KEEP (DENSE_RANK FIRST ORDER BY t DESC) AS w,
       MIN(t) KEEP (DENSE_RANK FIRST ORDER BY t DESC) AS t,
       MIN(curr) KEEP (DENSE_RANK FIRST ORDER BY t DESC) AS curr,
       MIN(prev) KEEP (DENSE_RANK FIRST ORDER BY t DESC) AS prev
FROM cp
WHERE curr != prev
GROUP BY p

在这两种情况下,输出是:

代码语言:javascript
复制
P           W       T           CURR    PREV
project 1   bob     09-MAY-20   a       b
project 2   bob     11-MAY-20   b       a

[医]小提琴上的演示(包括原始查询的CTE版本)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61728524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档