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
因此,所有我需要的是知道如何从一组
你试过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
此答案中的代码格式解决了该问题。谢谢。 – 2010-12-27 03:27:18
做重复的记录在派生表上交叉连接: (选择1作为群组联盟所有选择2)
我认为这里的基本问题是row_number()会在第一个select中更改editionID,这需要反映在第二个select的editionID中。因此,为什么我不能使用工会。 – 2010-12-17 17:39:28
在派生表上进行交叉连接时,您不应该需要row_number()。 – Rory 2010-12-23 14:03:20
我创建副本和他们的计数临时表做一个ROW_NUMBER了工会。 然后,我会筛选原始表格,使其只有唯一的行,并为临时表格中的每一行插入另一行,并增加其editionID。
在MySQL中,我会使用user @ variables;不确定关于MS SQL。
到目前为止好。一次完成它将会很好,而不是使用超过数千条记录的光标。 – 2010-12-17 17:41:15
很难正确理解你想要的东西。你说每行应该有一个重复,但在你的例子中,你只有两个重复。你能从样本数据中准确地列出你想要的结果吗? aGroups应该是原来的1和2的副本? “1比1排”意味着什么? – Rory 2010-12-17 17:27:44
第三个例子是我期望的结果。 0组的areaGroup将areaGroup值移至aGroups值(逗号分隔的集合,但只有一个值)。从本质上讲,唯一的困难是如果我们需要更改editionID以使其具有唯一性,那么我们需要在原始列表中反映该版本的更改。我没有看到我们怎么能做到这一点,没有从一套(没有联盟)开始。 – 2010-12-17 17:48:13
你很难理解你想要什么。你为什么要'重新编号'EditionID?你能准确地说出你想如何计算'重新编号'的EditionID吗?你说'原始和重复记录必须有相同的editionID',但是你想重新编号吗?在您的示例输出中,很难确定哪些行与哪些原始行相关。也许放一个'OriginalRowId'列来澄清这一点。 – Rory 2010-12-23 14:02:38