我有一个存储在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
我尝试过几种不同的方法,但所有这些方法似乎需要很长时间(小时),所以我想知道是否有更有效的方法。如果做不到这一点,我的下一个想法是分区表。
我试过了:
使用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],'')
)
MAX(ID)和按组属性分组。
答案 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
希望这会有所帮助......