2016-12-07 100 views
0

我有東西在我的數據庫來解決這裏是:SQL循環結合成一個

我有重複的行這樣的一個表:

enter image description here

的重複列是IDPatientIDObjet和你永遠不應該都重複,這就是爲什麼我把兩個列上的密鑰,但它有點太晚..所以我必須解決這個問題,通過結合這些重複行到一個而不會丟失數據和把它放進去DER。

示例,您可以在圖片中看到texte_1列包含每個日期2010-11-25和2011-11-04的日期。 2010-11-25的日期早於2011年11月4日所以我必須將2011-11-04放入第一行的texte_2列,並循環顯示我所在行中的每個數據,並驗證日期年齡較大或沒有。如果是的話,我必須用第二行替換第一行中的數據,將我們已經替換的信息替換爲temp var,然後找到一個新列(「Texte_X」)插入到同一行中,替換數據並驗證同時如果它不老。

我可以有多個重複的行我的表,我知道在SQL服務器循環是緩慢的,但真的很感激,很好地解決了此解決這個問題。

這裏有多個重複的行的例子

enter image description here

+2

你並不需要循環,你可以使用'max'。例如。將最大記錄選擇到新表中並替換實際表中的數據。 – HoneyBadger

+0

@alexandre是否要刪除舊日期的行並保留一組? – GurV

+0

如果有50個重複項會怎麼樣,您是否會無限期地向表中添加'Texte_n..IDRV_n'? –

回答

0

怎麼樣MERGE

merge mytable as t 
using (
    select idPatient, idObject, max(texte_1) dt 
    from mytable 
    group by idPatient, idObject 
) s on t.idPatient = s.idPatient 
and t.idObject = s.idObject 
and t.texte_1 != s.dt 
when matched then delete; 
+0

我不能探微合併我必須訂購的數據 – alexandre

+0

日期的降序?當你只保留最大texte_1值的時候有什麼用? – GurV

+0

是啊我只是想,只有11我266行已合併......而合併的行有刪除我的舊數據.. – alexandre

0

您可以使用ROW_NUMBER()功能,您ID場訂購的副本,然後PIVOT到反規範化的記錄,或自連接,如:

;with cte as (SELECT *,RN = ROW_NUMBER() OVER(PARTITION BY IDPatient,IDObjet ORDER BY ID) 
       FROM YourTable 
      ) 
SELECT a.IDPatient,a.IDObjet,a.Texte_1, b.Texte_1 as Texte_2, c.Texte_1 AS Texte_3 
FROM cte a 
LEFT JOIN cte b 
    ON a.IDPatient = b.IDPatient 
    AND a.IDObjet = b.IDObjet 
    AND b.RN = 2 
LEFT JOIN cte c 
    ON a.IDPatient = c.IDPatient 
    AND a.IDObjet = c.IDObjet 
    AND c.RN = 3 
WHERE a.RN = 1 

這是假設ID順序就足夠了,如果需要的話,你可以將其更改爲你的日期字段。既然你最終想要刪除的重複行,你既可以運行此查詢到一個新表,或者你用這個作爲你更新的基礎之後,您可以從CTE DELETE記錄上述where RN > 1

就個人而言,我會避免使用非歸一化的Texte_1-10結構,並添加一個與RN字段等效的新字段作爲密鑰的一部分。

+0

那麼它不正是我所需要的...我不僅可以假設ID訂單,因爲你可以有date_1 = 2015-01-01和date_2 = 2013-01-01我必須按順序排列,你的答案只能給我每行第一列(texte_1,date_1,IDRV_1,Unite_1 ...) – alexandre

+0

這裏是我的答案 – alexandre

+0

正如我所提到的,可以將'ID'更改爲'ROW_NUMBER()''ORDER BY'部分的日期字段。如果你做了一個'SELECT *'你會看到所有的字段都可用,我只是沒有把它們全部列出來。 –