2017-07-27 74 views
0

我想仅隔离从'900'更改为'RCF'的源键值。我的代码现在返回所有记录,无论有任何更改。SQL查询,返回包含更改的数据

select 

PD_END_DT, 
SOURCE_KEY_VALUE, 
Fed_Class_cd 

from XXXXXXXXXXXX 
where (pd_end_dt = '2015-11-30' or PD_END_DT = '2015-12-31') 
    and (FED_CLASS_CD = '900' or FED_CLASS_CD = 'RCF') 

样本数据:

pd_ned_dt  Source_key_value  Fed_Cls_Cd 

2015-11-30 CML0100000565101565000000000 900 
2015-11-30 CML0100000613059250000613000 900 
2015-12-31 CML0100000613059250000613000 RCF 
2015-12-31 CML0100000613060250000613000 RCF 
2015-11-30 CML0100000613060250000613000 900 
2015-11-30 CML0100000613061250000613000 900 
2015-12-31 CML0100000613061250000613000 RCF 
2015-12-31 CML0100000613062250000613000 RCF 
2015-11-30 CML0100000613062250000613000 900 
2015-11-30 CML0100000633001633000000000 900 
2015-12-31 CML0100000633001633000000000 900 
2015-12-31 CML0100000641001641000000000 RCF 
2015-11-30 CML0100000641001641000000000 900 
2015-11-30 CML0100000641002641000000000 900 
2015-12-31 CML0100000641002641000000000 RCF 
2015-12-31 CML0100000641003641000000000 RCF 

什么是查询我可以用它来只显示记录我想看到什么?谢谢您的帮助!

+0

样本数据添加也 – 2017-07-27 14:28:42

+0

'“900”到“RCF''没有任何意义添加样本数据和预期的结果 –

+1

只是让我清楚,你必须在多个记录表中的每个键值,因此您需要一个查询来检查密钥值,其中代码= 900且日期<12/31/2015和相同的键值作为RCF在日期= 12/31/2015时插入? –

回答

0

尝试......

IF OBJECT_ID('tempdb..#TestData', 'U') IS NULL 
BEGIN -- DROP TABLE #TestData; 
    CREATE TABLE #TestData (
     pd_ned_dt DATE NOT NULL, 
     Source_key_value CHAR(28) NOT NULL, 
     Fed_Cls_Cd CHAR(3) NOT NULL 
     ); 
    INSERT #TestData (pd_ned_dt, Source_key_value, Fed_Cls_Cd) VALUES 
     ('2015-11-30', 'CML0100000565101565000000000', '900'), 
     ('2015-11-30', 'CML0100000613059250000613000', '900'), 
     ('2015-12-31', 'CML0100000613059250000613000', 'RCF'), 
     ('2015-12-31', 'CML0100000613060250000613000', 'RCF'), 
     ('2015-11-30', 'CML0100000613060250000613000', '900'), 
     ('2015-11-30', 'CML0100000613061250000613000', '900'), 
     ('2015-12-31', 'CML0100000613061250000613000', 'RCF'), 
     ('2015-12-31', 'CML0100000613062250000613000', 'RCF'), 
     ('2015-11-30', 'CML0100000613062250000613000', '900'), 
     ('2015-11-30', 'CML0100000633001633000000000', '900'), 
     ('2015-12-31', 'CML0100000633001633000000000', '900'), 
     ('2015-12-31', 'CML0100000641001641000000000', 'RCF'), 
     ('2015-11-30', 'CML0100000641001641000000000', '900'), 
     ('2015-11-30', 'CML0100000641002641000000000', '900'), 
     ('2015-12-31', 'CML0100000641002641000000000', 'RCF'), 
     ('2015-12-31', 'CML0100000641003641000000000', 'RCF'); 
END; 

--============================================================= 

SELECT 
    ChangeDate = td1.pd_ned_dt, 
    td1.Source_key_value, 
    BeforeChange = td2.Fed_Cls_Cd, 
    AfterChange = td1.Fed_Cls_Cd 
FROM 
    #TestData td1 
    JOIN #TestData td2 
     ON td1.Source_key_value = td2.Source_key_value 
WHERE 
    td1.Fed_Cls_Cd = 'RCF' 
    AND td1.pd_ned_dt >= '2015-11-30' 
    AND td1.pd_ned_dt < '2016-01-01' 
    AND td2.Fed_Cls_Cd = '900' 
    AND td1.pd_ned_dt > td2.pd_ned_dt; 
+0

嗯没有给我任何结果。 –

+0

根据新的测试数据更新了答案。 –

0
select distinct pd_ned_dt , Source_key_value , Fed_Cls_Cd from xxx As a 
where 
Exists(select Source_key_value from xxx where Source_key_value=a.Source_key_value and Fed_Cls_Cd='900') 
+0

这是你在找什么 – Ashu

+0

这只返回记录与RCF作为fed_class_cd,不完全。我需要返回source_key_values和fed_class_cd从900更改为RCF并显示两个结果的东西 –

+0

感谢您使用此代码段,该代码段可能会提供一些即时帮助。通过展示*为什么*这是一个很好的解决方案,对未来的读者会有更好的解决方案,这将为它的教育价值提供一个合适的解释[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的问题。请编辑您的答案以添加解释,并指出适用的限制和假设。 –

0

这个怎么样?

SELECT * 
FROM #XXXXXXXXXXXX q900 
    INNER JOIN #XXXXXXXXXXXX qRCF 
     ON q900.SOURCE_KEY_VALUE = qRCF.SOURCE_KEY_VALUE  
     AND q900.pd_end_dt < qRCF.pd_end_dt 
     AND q900.FED_CLASS_CD = '900' 
     AND qRCF.FED_CLASS_CD = 'RCF' 

注意:如果PD_END_DT是不相关的一切,你需要知道,针对重点的RCF记录大于900记录新的一些其他的方式。任何其他可用于此的字段?

+0

不幸的是,没有其他领域可以区分该领域的变化。 –

+0

确实'900'只会变成'RCF'(而不是相反),并且没有任何其他代码?或者RCF可能更改为900或900更改为其他代码? – Dazzer

+0

它可以更改为很多不同的选项 –

0

这是你在找什么?我不确定我是否理解你的问题。

SELECT 
mt2.* 
FROM 
dbo.MyTable mt1 
JOIN dbo.MyTable mt2 
ON mt1.SOURCE_KEY_VALUE = mt2.SOURCE_KEY_VALUE 
AND mt1.FED_CLASS_CD = 'RCF' // data that changed from RCF 
AND mt2.FED_CLASS_CD = '900' //data that changed to 900 
AND mt1.PD_END_DT < mt2.PD_END_DT // data that happened after, so updated 
WHERE 
AND mt1.PD_END_DT >= '2015-11-30' 
AND mt1.PD_END_DT < '2016-01-01' 
0

尝试下面的查询,只是一个想法,你可以完成它。希望它可以帮助你

;with testD 
as 
(
    select * 
    , row_number() over(partition by Source_key_value order by pd_ned_dt) rowNumber 
    from XXXXXXXXXXXX 
) 
select prevData.*,currentData.* 
    from testD currentData left join testD prevData on 
    currentData.Source_key_value= prevData.Source_key_value and currentData.rowNumber=prevData.rowNumber+1 
    where prevData.Fed_Class_CD ='900'