2016-05-31 96 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