【问题标题】:how to select first non-duplicate data in sql如何在sql中选择第一个非重复数据
【发布时间】:2014-08-12 12:12:14
【问题描述】:

我在 sql 中有表(Id,Name,Type)。

Id, Name, Type:
1, AA, 1
2, BB, 2
3, CC, 4
4, DD, 2
5, EE, 3
6, FF, 3

我想选择第一个不重复的数据。结果:

Id, Name, Type:
1, AA, 1
2, BB, 2
3, CC, 4
6, FF, 3

我使用 DISTINCT 和 GROUP BY,但不起作用,我选择了所有行,而不是使用 DISTINCT 或 GROUP BY 选择类型。

select DISTINCT Type
from tbltest

【问题讨论】:

  • 所以你要删除重复的Types 和第一个意思是根据ID?
  • 我想选择不重复的“类型”并按“ID”排序。

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

我喜欢 CTE 和 ROW_NUMBER,因为它允许轻松更改以删除重复项。

假设要删除重复的Types 和第一个意思是根据ID:

WITH CTE AS(
   SELECT Id, Name, Type,
       RN = ROW_NUMBER() OVER ( PARTITION BY Type ORDER BY ID )
   FROM dbo.Table1
)
SELECT Id, Name, Type FROM CTE WHERE RN = 1

【讨论】:

  • @user3933292:是的,除非数据不是非常大(数十亿条记录),否则它是有效的。 stackoverflow.com/a/2309247/284240 当然你需要使用合适的索引。
【解决方案2】:

您可以通过多种方式做到这一点。我的偏好是row_number():

select id, name, type
from (select t.*, row_number() over (partition by type order by id) as seqnum
      from tbltest t
     ) t
where seqnum = 1;

编辑:

以上的表现应该是合理的。但是,使用type, id 上的索引可能会更快:

selct id, name, type
from tbltest t
where not exists (select 1 from tbltest t2 where t2.type = t.type and t2.id < t.id);

即选择相同type不低于id的行。

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2021-05-27
    • 2013-05-07
    • 2018-09-29
    • 2015-04-19
    • 2018-09-03
    • 2020-03-31
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多