0

現在、scd タイプ 2 データをディメンションにロードするクエリの最後の部分を完了しようとしています。以下に示すデータに基づいて、古いレコードの期限切れや履歴の追跡などに加えて、ディメンションに挿入できる出力を生成したいと考えています。データは、属性が変更された最新のレコードを持っているようなものです。変更された値は、変更が行われた日付、つまり dateOfchange とともに Lookup 列に表示されます。この dateOfchange は、明らかに最新のレコードの有効な日付になるはずです。

サンプル データは次のとおりです。

CREATE TABLE #tstDimPortfolio
(
[ID][INT] IDENTITY (1,1) NOT NULL,
[UPI] [varchar](20) NOT NULL,
[MF_CODE] [varchar](10) NULL,
[BH_Code] [varchar](10) NULL,
[CR_Code] [varchar](10) NULL,
[ValidFrom][varchar](10) NOT NULL,
[ValidTo][varchar](10) NULL,
[IsCurrent] [CHAR] (1) NULL,
[DateofChange] [varchar](10) NULL,
[LookupMF_CODE] [varchar](10) NULL,
[LookupBH_Code] [varchar](10) NULL,
[LookupCR_Code] [varchar](10) NULL,
) 

INSERT INTO #tstDimPortfolio
SELECT 'B06531','B06531','','B06531','20111230',NULL,'Y','20120101','','B06531', ''
UNION ALL
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120102','BLI004','',    ''UNION ALL 
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120103','BLI005','',    ''UNION ALL 
SELECT 'BLI027','BLI027','L147','BBL_GBN','20111230',NULL,'Y','20120104','','L146', ''

このデータを使用すると、新しい出力は次のようになります。

UPI MF_CODE   BH_Code  CR_Code   ValidFrom  ValidTo      IsCurrent
_______________________________________________________________________
B06531  B06531  B06531               20111230   20120101        N
B06531  B06531  B06531  B06531       20120101   NULL            Y
BLI003  BLI003  BBL_WORLD            20111230   20120102        N
BLI003  BLI004  BLI003  BBL_WORLD    20120102   20120103        N
BLI003  BLI005  BLI003  BBL_WORLD    20120103   NULL            Y
BLI027  BLI027  L147    BBL_GBN      20111230   20120104        N
BLI027  BLI027  L146    BBL_GBN      20120104   NULL            Y

何か案は

4

2 に答える 2

0

再帰cteを使用して、目的の結果を得ることができました。UPI は自然キーです。ただし、イベントは実際には、ピボットされてディメンションに結合された別のファイルから取得されます。(BLI003) には 2 つのイベントがあったため、2 つの行がありました。SQLは次のとおりです。

 CREATE TABLE #tstDimPortfolio
 (
[ID][INT] IDENTITY (1,1) NOT NULL,
[UPI] [varchar](20) NOT NULL,
[MF_CODE] [varchar](10) NULL,
[BH_Code] [varchar](10) NULL,
[CR_Code] [varchar](10) NULL,
[ValidFrom][varchar](10) NOT NULL,
[ValidTo][varchar](10) NULL,
[IsCurrent] [CHAR] (1) NULL,
[DateofChange] [varchar](10) NULL,
[LookupMF_CODE] [varchar](10) NULL,
[LookupBH_Code] [varchar](10) NULL,
[LookupCR_Code] [varchar](10) NULL,


) 

INSERT INTO #tstDimPortfolio
SELECT 'B06531','B06531','','B06531','20111230',NULL,'Y','20120101','','B06531', ''UNION ALL
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120102','BLI004','', ''UNION ALL 
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120103','','BLI005', ''UNION ALL 
SELECT 'BLI027','BLI027','L147','BBL_GBN','20111230',NULL,'Y','20120104','','L146', ''





SELECT  ROW_NUMBER() OVER (PARTITION BY UPI ORDER BY UPI, DateofChange) Sequence,
    UPI, 
    CASE WHEN LookupMF_CODE <> '' THEN LookupMF_CODE ELSE MF_CODE END MF_CODE, 
    CASE WHEN LookupMF_CODE <> '' THEN LookupBH_Code ELSE BH_Code END BH_Code, 
    CASE WHEN LookupCR_Code <> '' THEN LookupCR_Code ELSE CR_Code  END CR_Code, 
    ValidFrom, ValidTo, IsCurrent, DateofChange,
    LookupMF_CODE,
    LookupBH_CODE,
    LookupCR_CODE
INTO #Dimension_Table
FROM #tstDimPortfolio


;WITH AddedDim AS
(SELECT * FROM 

(
SELECT 
ROW_NUMBER() OVER (PARTITION BY UPI ORDER BY UPI, DateofChange) Sequence,
UPI,
CASE WHEN LookupMF_CODE <> '' THEN LookupMF_CODE ELSE MF_CODE END MF_CODE, 
CASE WHEN LookupBH_CODE <> '' THEN LookupBH_Code ELSE BH_Code END BH_Code, 
CASE WHEN LookupCR_Code <> '' THEN LookupCR_Code ELSE CR_Code  END CR_Code, 
DateofChange AS ValidFrom, 
ValidTo, 
IsCurrent 
FROM #tstDimPortfolio
)A
WHERE SEQUENCE = 1

UNION ALL
SELECT  
DT.Sequence
, DT.UPI
,CASE WHEN DT.LookupMF_CODE <> '' THEN DT.LookupMF_CODE ELSE DM.MF_CODE END MF_CODE
,CASE WHEN DT.LookupBH_CODE <> '' THEN DT.LookupBH_Code ELSE DM.BH_Code END BH_Code 
,CASE WHEN DT.LookupCR_Code <> '' THEN DT.LookupCR_Code ELSE DM.CR_Code  END CR_Code
,DT.DateofChange AS ValidFrom 
,DT.ValidTo 
,DT.IsCurrent 
FROM #Dimension_Table dt inner join
AddedDim dm
on DT.UPI = DM.UPI
AND dt.Sequence = DM.Sequence + 1 
)

SELECT * INTO #temp FROM AddedDim

于 2012-02-14T23:22:09.350 に答える
0

このテーブルの自然キーが何であるかについて混乱しています。「UPI」ですか?その場合、同じ UPI を持つ 2 つのレコード (BLI003) がありますが、どちらもアクティブであり、決してそうではありません。

とにかく、それがUPIだと仮定してください。B06531 を更新する場合は、更新をテーブルに取得します。

CREATE TABLE #tstDimPortfolioUpdates
(
[ID][INT] IDENTITY (1,1) NOT NULL,
[UPI] [varchar](20) NOT NULL,
[MF_CODE] [varchar](10) NULL,
[BH_Code] [varchar](10) NULL,
[CR_Code] [varchar](10) NULL,
[ValidFrom][varchar](20) NOT NULL,
[ValidTo][varchar](15) NULL,
[IsCurrent] [CHAR] (1) NULL,
[DateofChange] [varchar](10) NULL,
[LookupMF_CODE] [varchar](10) NULL,
[LookupBH_Code] [varchar](10) NULL,
[LookupCR_Code] [varchar](10) NULL,
) 


INSERT INTO #tstDimPortfolioUpdates
SELECT 'B06531','B06531','B06531','B06531','20120102',NULL,'Y','20120102','','B06531', '' 

ValidTo、IsCurrent、および DateOfChange の値を変更して、アクティブでなくなったレコードを設定します。

UPDATE dp
SET ValidTo = '20120101', IsCurrent = 'N', DateOfChange = '20120101'
FROM #tstDimPortfolio dp
INNER JOIN #tstDimPortfolioUpdates up ON dp.UPI = up.UPI
AND dp.IsCurrent = 'Y'

新しいレコードを挿入する

INSERT INTO #tstDimPortfolio (UPI, MF_Code, BH_Code, CR_Code, ValidFrom, ValidTo
    ,IsCurrent, DateOfChange, LookupMF_Code, LookupBH_Code, LookupCR_Code)
SELECT UPI, MF_Code, BH_Code, CR_Code, ValidFrom, ValidTo
    ,IsCurrent, DateOfChange, LookupMF_Code, LookupBH_Code, LookupCR_Code
FROM #tstDimPortfolioUpdates

アップデートが正しいことを再確認してください

SELECT * FROM #tstDimPortfolio
ORDER BY UPI
于 2012-02-14T19:42:16.643 に答える