简单的问题是如何使用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
所以我需要的是知道如何从单个集合中复制记录
答案 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