2016-05-31 97 views
1

我創建了一個請求,它返回具有相同列值的行的ID。例如:SQL根據多列選擇重複行

id | Value 
______________ 
1  | label1 
2  | label1 
3  | label1 
4  | label2 
5  | label2 

我想獲得這種結果:

id | AlternateID | Value 
______________________________ 
1  | 2    | label1 
1  | 3    | label1 
4  | 5    | label2 

我迄今爲止最好的結果是:

id | AlternateID | Value 
______________________________ 
1  | 2    | label1 
2  | 1    | label1 
1  | 3    | label1 
3  | 1    | label1 
4  | 5    | label2 
5  | 4    | label2 

但正如你所看到的,我重複了前兩列的值

...現在,沒有使用遊標,我卡住了。

我的SQL Server 2008年

感謝您的幫助

+1

你能解釋數字背後的邏輯嗎?這對我來說並不明顯。 –

+0

我們不能說出你真正在這裏尋找什麼。你想分組並得到一個計數? – Chuck

+0

第一個表號對應於該行的id。 第二個表就像一個Map。例如,ID 1可以用來代替ID 2和ID 3/ID 4可以用來代替ID5 我猜這是圍繞着一組group by ...但是我真的被卡住了...... – r4phG

回答

1

使用派生表,讓您的基值,並加入回原始表。

SELECT 
    a.id, 
    b.id as AlternateID, 
    a.value 
FROM 
    (SELECT MIN(id) as id , value FROM YourTable GROUP BY value) a 
JOIN YourTable b on a.value = b.value and a.id <> b.id 
+0

這是解決方案!非常感謝你 ! – r4phG

1

你似乎要對具有相同值的id。

with t as (
     <your query here> 
    ) 
select t1.id as id1, t2.id as id2, t1.value 
from t t1 join 
    t t2 
    on t1.id < t2.id and t1.value = t2.value; 
+0

解決方案的問題是,我得到這個 '1 | 2 | label1'// '2 | 1 | label1' .... 我也得到了這個結果加入:/ – r4phG

+0

@ r4phG。 。 。一點也不。 't1.id

+0

你說得對,我用't1.id <> t2.id'這個問題。抱歉,謝謝 – r4phG

0

先拿到分排那麼外部連接或外部應用到替代值

SELECT mt.id, mt2.AlternateID, mt.Value 
FROM (SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY VALUE ORDER BY id) Rn 
      FROM myTable 
     ) mt 
     OUTER APPLY (SELECT id [AlternateID] -- use CROSS APPLY to only return dupes 
        FROM myTable mt2 
        WHERE mt2.VALUE = mt.VALUE AND mt2.id <> mt.id) mt2 
WHERE Rn = 1 
+0

對不起,也許這可以工作,但我無法得到這個查詢工作:/ – r4phG

+0

你嘗試使用你的實際表名? – JamieD77

+0

^^。當然 !我有一個問題圍繞OVER(分區...)Rn – r4phG