2017-12-01 6 views
1

IDの数が1つのテーブルがあります。 SourceIDごとに1〜4の固有IDを持つことができます。以下に示すように、1から4までのすべてのユニークIDをカウントするためのCTEを作成しました。1フィールドの数に基づいて4つのフィールドを更新する方法

enter image description here

はCNTに基づいて、およびsourceid_revisedプラスasofdateに参加し、私はあなたが下の画像の中に見えるように、IDを持つ別のテーブルを更新します。

enter image description here

擬似コードは次のようになります:私は、SQL Server 2008の

アップデートを使用しています

UPDATE RAW_DATA 
SET 
    RAW_DATA.ID1 = case when Count_Of_IDs.cnt=1 then FIRST(PID) end, 
    RAW_DATA.ID2 = case when Count_Of_IDs.cnt=2 then SECOND(PID) end, 
    RAW_DATA.ID3 = case when Count_Of_IDs.cnt=3 then THIRD(PID) end, 
    RAW_DATA.ID4 = case when Count_Of_IDs.cnt=4 then Forth(PID) end 
FROM RAW_DATA INNER JOIN 
     Count_Of_IDs ON RAW_DATA.SourceID_Revised = Count_Of_IDs.Sourceid_Revised AND 
     RAW_DATA.AsofDate = Count_Of_IDs.asofdate 

コメントをするのではなく、オリジナルの投稿を編集するのが最も簡単だと思います。この部分はうまくいくようです。

select *, count(PID) over (partition by SourceID_Revised) RN 
FROM [dbo].[RAW_DATA] 

ので、RNは、正常に動作するようです。4.より大きくなることはありませんが、私は働いて、それの残りの部分を取得することはできません。私は、DENSE_RANKバージョンをテストしています、と私は、この行のエラーを取得しておいてください。

cte2 as (

エラー= Incorrect syntax near 'cte2'

動作するはずそれはほとんどこのように思える...

Select SourceID_Revised, ID, ID1, ID2, ID3, ID4, RN 
    Set ID1 = max(case when RN = 1 then ID end), 
    Set ID2 = max(case when RN = 2 then ID end), 
    Set ID3 = max(case when RN = 3 then ID end), 
    Set ID4 = max(case when RN = 4 then ID end) 
FROM 
(
select SourceID_Revised, ID, ID1, ID2, ID3, ID4, count(ID) over (partition by SourceID_Revised) RN 
FROM [dbo].[RAW_DATA] 
) AS Summary 

を。 ..もちろん、それはしません。

+0

IDをピボットしたいと思っているようです... – scsimon

+0

これはおそらくピボットの一種です。私はカウントをしているテーブルに内部結合をする必要があると思うが、ピボットはそのステップを排除することができるかもしれない。私は確信していません... – ryguy72

+0

ロングフォーマットは、ワイドフォーマットよりも効率、スケーラビリティ、および保守性が優れているため、このようなテーブルデザインは推奨されません。 – Parfait

答えて

1

私はこれがあなたが探しているものだと思います。しかし、私はあなたが実際にソーステーブルを更新したいのではなく、これを提示することを実際には望んでいません(以下の最終的な選択で)。 ID列を無視して、重複行を削除する必要があるBeanを更新します。それが本当に欲望であれば、それを処理させてもらうよ。私はそれを残して、それが私であれば単にそれを提示するだろう。

with cte as(
select *, row_number() over (partition by SourceID_Revised order by ID, AsOfDate) RN 
FROM yourTable 
), 

cte2 as (
select 
    SourceID_Revised 
    ,AsOfDate 
    ,ID = NULL 
    ,ID1 = max(case when RN = 1 then ID end) 
    ,ID2 = max(case when RN = 2 then ID end) 
    ,ID3 = max(case when RN = 3 then ID end) 
    ,ID4 = max(case when RN = 4 then ID end) 
group by 
    SourceID_Rebised 
    ,AsOfDate 
from cte) 


select * from cte2 

--UPDATE R 
--set 
-- R.PID1 = ID1 
-- ... 
--from RAW_DATA R 
--inner join cte2 on 
--cte2.SourceID_Revised = r.SourceID_Revised 

また、あなたはcount(ID) over (partition by SourceID_Revised) RNを使用することができますが、2つのIDのは、同じ数を持っている場合は、どのようにあなたはそれを扱うでしょうか?したがって、私はおそらくDENSE_RANK()を2番目のCTEに使用します。 ....

with cte as(
select *, count(ID) over (partition by SourceID_Revised) RN 
FROM YourTable 
), 

ctex as(
select *, dense_rank() over (partition by SourceID_Revised order by RN, ID) RN2 
from cte) 

cte2 as (
select 
    SourceID_Revised 
    ,AsOfDate 
    ,ID = NULL 
    ,ID1 = max(case when RN2 = 1 then ID end) 
    ,ID2 = max(case when RN2 = 2 then ID end) 
    ,ID3 = max(case when RN2 = 3 then ID end) 
    ,ID4 = max(case when RN2 = 4 then ID end) 
group by 
    SourceID_Rebised 
    ,AsOfDate 
from ctex) 


select * from cte2 
+0

はい、これはうまくいくと思います。私が実際に使っているテーブルをどうやって渡すのですか?私は「cteから」と「ctexから」を見る。 – ryguy72

+0

ごめんなさいYourTableをテーブル名に置き換えてください(最初のcteにあります) – scsimon

関連する問題