2010-12-17 97 views
0

一個簡單的問題是,如何使用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

回答

1

你試過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

2

做重複的記錄在派生表上交叉連接: (選擇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

2

我創建副本和他們的計數臨時表做一個ROW_NUMBER了工會。 然後,我會篩選原始表格,使其只有唯一的行,併爲臨時表格中的每一行插入另一行,並增加其editionID。

在MySQL中,我會使用user @ variables;不確定關於MS SQL。

+0

到目前爲止好。一次完成它將會很好,而不是使用超過數千條記錄的光標。 – 2010-12-17 17:41:15

相關問題