【问题标题】:Return only rows where column values has changed仅返回列值已更改的行
【发布时间】:2016-12-12 09:24:20
【问题描述】:

我正在尝试以下查询,但返回了 67 行。 但只有当“是 PEP 的实体”值发生变化时,我才需要这些值。

select tpe.extrnl_id_val as "CE",
CASE WHEN tc.POLICALLY_EXPOSED_PERSON_IND=1 THEN (select 'Yes' from dual)
ELSE (select 'No' from dual) END as "Is this entity a PEP",
tc.upd_ts as "Date"
from rkyc_em_01.tclient_jrnl tc,rkyc_em_01.tparty_extrnl_id tpe
where tc.party_id=tpe.party_id
and extrnl_id_val in ('1231554')
group by POLICALLY_EXPOSED_PERSON_IND, extrnl_id_val,tc.upd_ts
order by tc.upd_ts desc

输出:

CE PEP 日期 1231554 是 2016 年 10 月 20 日上午 11:52:36 1231554 是 2016 年 10 月 20 日上午 11:52:24 1231554 是 2016 年 10 月 20 日上午 11:50:11 1231554 是 2016 年 10 月 14 日上午 10:38:30 1231554 否 2016 年 8 月 18 日上午 10:35:51 1231554 否 2016 年 7 月 25 日凌晨 3:22:05 1231554 否 2/17/2016 上午 1:58:40 1231554 否 2015 年 10 月 9 日凌晨 3:23:54 1231554 否 2015 年 6 月 26 日上午 10:33:02 1231554 否 2015 年 6 月 16 日上午 7:43:23 1231554 否 2014 年 6 月 27 日下午 4:51:19 1231554 否 2014 年 2 月 25 日上午 9:42:21 1231554 否 2014 年 2 月 18 日上午 9:27:30 1231554 否 2013 年 12 月 12 日上午 9:29:10 1231554 否 2013 年 11 月 25 日上午 6:56:23 1231554 否 2013 年 5 月 31 日上午 7:37:32 1231554 否 2013 年 5 月 31 日上午 7:37:27 1231554 否 2013 年 3 月 27 日晚上 8:09:45 1231554 否 2013 年 3 月 4 日下午 5:33:02 1231554 否 2012 年 12 月 10 日下午 7:46:33 1231554 否 2012 年 9 月 24 日晚上 8 点 47 分 30 秒 1231554 否 2012 年 9 月 24 日晚上 8 点 47 分 22 秒 1231554 否 2011 年 11 月 21 日上午 11:32:28 1231554 否 2011 年 11 月 21 日上午 11:32:27 1231554 否 2011 年 11 月 18 日下午 3:48:04 1231554 否 2011 年 8 月 6 日下午 1:10:14 1231554 否 2011 年 8 月 6 日上午 7:09:18 1231554 否 2011 年 8 月 6 日上午 6 点 46 分 55 秒

预期输出:

CE PEP 日期 1231554 是 2016 年 10 月 14 日上午 10:38:30 1231554 否 2011 年 8 月 6 日上午 6 点 46 分 55 秒

【问题讨论】:

  • 分享您的预期输出。
  • 为什么是GROUP BY?你没有聚合任何东西。这仅仅意味着DISTINCT吗?如果是这样,是什么让你得到重复? tctpe 或两者中的多个匹配项?你会一直只寻找一个extrnl_id_val 吗?你的 DBMS 是什么?并且:您不应该再使用那些 1992 年以前的逗号分隔连接。
  • 嘿 Thorsten,我已经用 distinct 更新了查询。不,我不会一直在寻找一个 extrnl_id_val

标签: sql


【解决方案1】:

以下是如何在标准 SQL 中执行此操作。你用LAG查看之前的记录,看看是否有变化。

select 
  extrnl_id_val as "ce",
  case when current_value = 1 then 'yes' else 'no' end as "is this entity a pep",
  upd_ts as "date"
from
(
  select 
    tpe.extrnl_id_val,
    tc.upd_ts,
    tc.polically_exposed_person_ind as current_value,
    lag(tc.polically_exposed_person_ind) over (partition by tpe.extrnl_id_val 
                                               order by tc.upd_ts desc) as previous_value
  from rkyc_em_01.tclient_jrnl tc
  join rkyc_em_01.tparty_extrnl_id tpe using(party_id)
  where tpe.extrnl_id_val in ('1231554')
)
where current_value <> previous_value or previous_value is null
order by upd_ts desc;

【讨论】:

  • 嗨,Thorsten Kettner,谢谢你,但我想要改变的值,但有了这个,我得到了现在的最新值。这个查询给了我 6 行。你能看看我的预期输出和帮助吗?感谢你的帮助。非常感谢
  • 我看到了您的预期输出,并确信我的查询会产生它。我必须承认,我看不出它如何不能产生所需的输出。该查询查看按日期排序的每个 ID,并检测对先前记录的更改。那应该行得通。你能告诉我这六行吗?
  • 我刚刚在我的 DBMS 上运行了一个小测试(一个表而不是两个包含您的示例记录)并且查询工作正常。有一个带有双 as 的错字,我已经更正了,但这不会导致错误的结果,而是语法错误。
  • 1231554 否 2011 年 8 月 6 日上午 6:46:55 1231554 否 2011 年 8 月 6 日上午 7:09:18 1231554 否 2016 年 8 月 18 日上午 10:35:51 1231554 是 10 /20/2016 11:52:36 AM 我只是在第一次选择后添加了 distinct 以使行数为 4,但这仍然不是我想要的。请您检查并提供帮助。
  • 我不明白这是怎么发生的。您可能希望单独执行子查询(添加 order by),以便查看所有数据。如果有polically_exposed_person_ind为空的行,您可能需要添加and polically_exposed_person_ind is not null。抱歉,我没有其他想法;这是你必须自己解决的问题。
【解决方案2】:

这应该能让你继续前进。

    SELECT * FROM (SELECT tpe.extrnl_id_val as "CE",
    CASE WHEN tc.POLICALLY_EXPOSED_PERSON_IND=1 THEN 
     (select 'Yes' from dual)
    ELSE 
     (select 'No' from dual) END as "Is this entity a PEP",
    tc.upd_ts AS "Date"
    from rkyc_em_01.tclient_jrnl tc, rkyc_em_01.tparty_extrnl_id tpe
    where tc.party_id = tpe.party_id
    and extrnl_id_val in ('1231554')
    group by POLICALLY_EXPOSED_PERSON_IND, extrnl_id_val,tc.upd_ts
    order by tc.upd_ts desc) T
  WHERE --add your condition here.

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2017-12-06
    • 2012-06-23
    • 2021-12-31
    • 1970-01-01
    • 2012-11-21
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多