查找不同记录的最有效方法,保留唯一ID

时间:2018-01-25 02:45:12

标签: sql

我有一个存储在SQL服务器表中的大型数据集,其中包含1个唯一ID和许多属性。我需要选择不同的属性记录,以及与该唯一组合关联的唯一ID。

示例数据集:

ID|Col1|Col2|Col3...
1|big|blue|ball
2|big|red|ball
3|big|blue|ball
4|small|red|ball

示例目标(2,3,4也可以接受):

ID|Col1|Col2|Col3...
1|big|blue|ball
2|big|red|ball
4|small|red|ball

我尝试过几种不同的方法,但所有这些方法似乎需要很长时间(小时),所以我想知道是否有更有效的方法。如果做不到这一点,我的下一个想法是分区表。

我试过了:

  1. 使用Where where,例如

    SELECT * from Table as T1
    where exists (select *
         from table as T2
          where
            ISNULL(T1.ID,'') <> ISNULL(T2.ID,'')
            AND ISNULL([T1].[Col1],'') = ISNULL([T2].[Col1],'')
            AND ISNULL([T1].[Col2],'') = ISNULL([T2].[Col2],'')
    )
    
  2. MAX(ID)和按组属性分组。

  3. GROUP BY属性,有计数&gt; 1.

2 个答案:

答案 0 :(得分:1)

如何使用group by

select min(id), col1, col2, col3
from t
group by col1, col2, col3;

这可能需要一段时间。这可能更有效:

select t.*
from t
where t.id = (select min(t2.id)
              from t t2
              where t.col1 = t2.col1 and t.col2 = t2.col2 and . . .
             );

这需要t(col1, col2, col3, . . ., id)上的索引。根据您的要求,这是在所有列上。

此外,这不适用于NULL的列。某些数据库支持ANSI标准is not distinct from进行空安全比较。如果你这样做,那么它也应该使用这个结构的索引。

答案 1 :(得分:0)

SELECT Id,Col1,Col2,Col3 FROM ( 
SELECT Id,Col1,Col2,Col3,ROW_NUMBER() OVER (Partition By Col1,Col2,Col3 Order By ID,Col1,Col2,Col3) valid
from Table as T1) t
WHERE valid=1

希望这会有所帮助......