SQL:需要为每个单独的记录创建两个唯一的记录

SQL:需要为每个单独的记录创建两个唯一的记录

问题描述:

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

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

这是我原来的集(它包含了超过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 

对于每一个记录,我需要创建一个重复的记录下勾搭的areaGroups一起“0”,然后创建一个逗号原来的分隔列表areaGroups作为一个单独的字段。 (“为什么”是一些愚蠢的程序员(我)在15年前犯了一个错误)。我可以根据需要重新编号editionID,但是原始和重复记录必须具有相同的editionID(因此为什么工会不工作) 。在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 

我知道你可以计算editionID像一排秩,像这样:

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

因此,所有我需要的是知道如何从一组

+0

很难正确理解你想要的东西。你说每行应该有一个重复,但在你的例子中,你只有两个重复。你能从样本数据中准确地列出你想要的结果吗? aGroups应该是原来的1和2的副本? “1比1排”意味着什么? – Rory 2010-12-17 17:27:44

+0

第三个例子是我期望的结果。 0组的areaGroup将areaGroup值移至aGroups值(逗号分隔的集合,但只有一个值)。从本质上讲,唯一的困难是如果我们需要更改editionID以使其具有唯一性,那么我们需要在原始列表中反映该版本的更改。我没有看到我们怎么能做到这一点,没有从一套(没有联盟)开始。 – 2010-12-17 17:48:13

+0

你很难理解你想要什么。你为什么要'重新编号'EditionID?你能准确地说出你想如何计算'重新编号'的EditionID吗?你说'原始和重复记录必须有相同的editionID',但是你想重新编号吗?在您的示例输出中,很难确定哪些行与哪些原始行相关。也许放一个'OriginalRowId'列来澄清这一点。 – Rory 2010-12-23 14:02:38

你试过UNION ALL而不是只有UNION

UDPATE也许我误解了这个问题,我以为你在解散重复数据时遇到问题。

如果问题是,你想你为什么不这样做财产以后像

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 
+0

此答案中的代码格式解决了该问题。谢谢。 – 2010-12-27 03:27:18

做重复的记录在派生表上交叉连接: (选择1作为群组联盟所有选择2)

+0

我认为这里的基本问题是row_number()会在第一个select中更改editionID,这需要反映在第二个select的editionID中。因此,为什么我不能使用工会。 – 2010-12-17 17:39:28

+0

在派生表上进行交叉连接时,您不应该需要row_number()。 – Rory 2010-12-23 14:03:20

我创建副本和他们的计数临时表做一个ROW_NUMBER了工会。 然后,我会筛选原始表格,使其只有唯一的行,并为临时表格中的每一行插入另一行,并增加其editionID。

在MySQL中,我会使用user @ variables;不确定关于MS SQL。

+0

到目前为止好。一次完成它将会很好,而不是使用超过数千条记录的光标。 – 2010-12-17 17:41:15