重复行上的SQL循环组合成一个

时间:2016-12-07 16:58:22

标签: sql sql-server loops replace duplicates

我的数据库中有一些问题需要解决:

我有一个像这样的重复行的表:

enter image description here

重复的列是 IDPatient IDObjet ,你应该永远不会重复这两个,这就是为什么我把Key放在两个列上但是它是' sa有点太晚..所以我必须通过将这些重复行合并为一个而不丢失数据并将其整理好来解决这个问题。

示例,正如您在图片中看到的那样,texte_1列包含每个日期2010-11-25和2011-11-04。日期2010-11-25在2011-11-04之前到来所以我必须将2011-11-04放入第一行的texte_2列并循环,就像我在我的行中的每个数据一样,并验证日期是否是不是更老了。如果是,我必须将第一行中的数据替换为第二行,将我们在temp var中替换的信息,然后找到一个新列(" Texte_X")插入同一行如果它不老,我会替换数据并同时验证。

我的表中可能有多个重复的行,我知道SQL服务器中的循环很慢,但我真的很感激这里有一个很好的解决方案。

这是多个重复行

的示例

enter image description here

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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订单已足够,如果需要,您可以将其更改为日期字段。由于您最终想要删除重复的行,您可以将此查询运行到新表中,或者在您使用此查询作为更新的基础之后,您可以DELETE来自where RN > 1上方的cte记录

就个人而言,我会避免使用非规范化的Texte_1-10结构,并添加一个与RN字段相当的新字段作为密钥的一部分。