选择首次出现的唯一列集合的所有行

时间:2012-03-24 16:50:50

标签: sql sql-server-2008 select distinct

我有一个SQL Server 2008数据库,我希望能够在一个表上执行以下操作。

该表有多列,根据两列的组合应该是唯一的。 我们将它们称为[ID1]和[ID2],然后有一个键我们称之为[index],一个可以重复的值称为[ID3]和一个名为[start]的日期时间值。

所以这就是困境,在表的范围内,对于每个[ID1]和[ID2]组合,应该只有一个[index]的增加值,这三者组成了来自客户端DB的自然PK。存储在一个统一的服务器数据库中。 ID3表示用于确定行何时存储在客户端数据库中的值,因此服务器中可能存在重复项

[ID1]   [ID2]   [index]     [ID3]   [start]         [other1]    [other2]
1   1   1       1   01/01/2000 01:00:00 5       6
1   1   2       2   01/01/2000 01:00:01 4       2
1   1   3       3   01/01/2000 01:00:02 5       2
1   1   4       3   01/01/2000 01:00:03 5       2
1   1   5       4   01/01/2000 01:00:04 4       6

我想要的是一个返回行,这些行是[ID3]和[other1]&amp;的唯一组合。 [other2]列,[ID1],[ID2]键的唯一列,我希望 first [start]符合该条件,基本上忽略了相同distinct子句的进一步出现。< / p>

从上表中它将返回......

[ID1]   [ID2]   [index]     [ID3]   [start]         [other1]    [other2]
1   1   1       1   01/01/2000 01:00:00 5       6
1   1   2       2   01/01/2000 01:00:01 4       2
1   1   3       3   01/01/2000 01:00:02 5       2
1   1   5       4   01/01/2000 01:00:04 4       6

值为3的[ID3]的第二行将被忽略,其他任何具有[ID3]重复的行

我似乎无法理解的是每个不同组合的第一个值,因为distinct不允许我选择其他列的值,group by需要一些聚合功能

1 个答案:

答案 0 :(得分:3)

;with a as
(
SELECT [ID1],[ID2],[index],[ID3],[start],[other1],[other2], 
rn = row_number() over (partition by ID1, ID2, ID3 order by start)
FROM yourtable
)
select 
[ID1],[ID2],[index],[ID3],[start],[other1],[other2], 
from a
where rn = 1