SQL:需要为每条记录创建两个唯一记录

时间:2010-12-17 17:20:28

标签: sql sql-server-2005 duplicate-data

简单的问题是如何使用PK获取一组记录,并为每个源创建两个记录,并且重复的键稍微改变了?换句话说,我记录了4000条记录并生成8000条记录,其中4000条记录完全相同,另外4000条记录略有修改。我不能做联盟,因为这基本上是两个选择(长篇故事)。

其余部分变得复杂,但可能需要提供示例。

这是我的原始集(它包含超过4000条记录)

dateGroup areaGroup itemID editionID
   1          1        1       1
   1          1        1       2
   1          2        1       1
   1          2        2       1

   2          1        1       1
   2          1        1       2
   2          2        1       1
   2          2        1       2

对于每条记录,我需要创建一个重复记录,将“区域组”组合在“0”下,然后创建一个以逗号分隔的原始区域组列表作为单独的字段。 (“为什么”是一些愚蠢的程序员(我)在15年前犯了一个错误。)我可以根据需要重新编号版本ID,但原始和重复记录必须具有相同的版本ID(因此联盟不起作用的原因) 。 PK保持与上述(所有字段)相同

dateGroup areaGroup itemID editionID aGroups
   1          0        1       1        1
   1          0        1       2        1
   1          0        1       1        2    // Duplicate (EditionID)
   1          0        2       1        2
   2          0        1       1        1
   2          0        1       2        1
   2          0        1       1        2    // Duplicate (EditionID)
   2          0        1       2        2

最终结果会根据需要对editionID重新编号,以使记录唯一。

dateGroup areaGroup itemID editionID aGroups  (EditionID is what is altered)
   1          0        1       1        1
   1          0        1       2        1
   1          0        1       2        2    1 changed to 2 (one more than row 1)
   1          0        2       1        2
   2          0        1       1        1
   2          0        1       2        1
   2          0        1       2        2    1 changed to 2 (one more than row 1)
   2          0        1       2        2

   1          1        1       1
   1          1        1       2
   1          2        1       2             1 changed to 2 (editionID) to match
   1          2        2       1

   2          1        1       1
   2          1        1       2
   2          2        1       2             1 changed to 2 to match above
   2          2        1       2

我知道你可以像这样排行计算版本ID:

select row_number() over ( 
       partition by dateGroup, itemID 
       order by dateGroup, itemID) as editionID

所以我需要的是知道如何从单个集合中复制记录

3 个答案:

答案 0 :(得分:2)

在派生表上进行交叉连接:  (选择1作为aGroups union all select 2)

答案 1 :(得分:2)

我会创建一个包含重复项及其计数的临时表。 然后我将原始表过滤为只有唯一的行,并为临时表中的每一行插入另一行,增加其editionID。

在MySQL中,我使用用户@variables;不确定MS SQL。

答案 2 :(得分:1)

您是否尝试UNION ALL而非UNION

UDPATE 或许我误解了这个问题,我认为你在联盟失去重复的问题上遇到了问题。

如果问题是你想对联盟做一个row_number,你为什么不这样做?

select row_number() over ( 
       partition by dateGroup, itemID 
       order by dateGroup, itemID) as editionID
FROM
(

         SELECT 

              dateGroup, itemID
          FROM TableA
          UNION ALL 
         SELECT 

              dateGroup, itemID
          FROM TableB 
) Data