2012-03-24 84 views
1

我有一个SQL Server 2008数据库,我希望能够在一个表上执行以下操作。选择首次出现唯一列集合的所有行

该表具有多列,根据两列的组合应该是唯一的。 我们将它们称为[ID1]和[ID2],然后有一个我们将称为[index]的密钥,并且一个值为可能是被复制,称为[ID3]和一个称为[start]的日期时间值。

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

[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] & [other2]列,[ID1],[ID2]键唯一,我希望第一个 [开始]符合该标准,基本上忽略进一步的出现次数同样明显的条款。

从上面的表中,它将返回...

[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]

重复我似乎无法得到的是第一个值的每个不同的组合,因为不同的不允许我选择其他列的值,一个组将通过需要一些聚合函数。

回答

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 
+0

我相信这让我大部分的方式出现,但是我划分由值为[ID3]副本,可能是,虽然它是ID 1],[ID2的范围内是唯一],这在桌子上并不是唯一的。因此,不能通过[ID3](其中[ID1],[ID2]是唯一的)进行分区...上面的作品在我过滤并运行单曲[ID1],[ID2]组合时,但它会不处理具有多个不同[ID1],[ID2]键的集合,因为它仅基于[ID3]将它们视为相同。这是一个复杂的问题,我很难详细解释它。 – Sabre 2012-03-25 16:35:56

+0

@Sabre在这种情况下,我改变了脚本,现在它将采用id1,id2和id3的每个组合中的第一个 – 2012-03-26 07:24:51

+0

我相信让我到那里,谢谢。 – Sabre 2012-03-26 13:57:41