如何根据表中的多个列获取唯一记录

时间:2012-05-30 12:51:48

标签: sql

考虑下表:

primaryKey   id    activity   template  creator   created
1            1      3           5         x       2011-10-13
2            2      4           2         y       2011-10-15  
3            2      4           7         z       2011-10-24
4            2      4           7         u       2011-10-29

从这里开始,我想检索具有idactivitytemplate唯一组合的记录。如果存在两个或更多这些字段的唯一组合,我想采用它们中的第一个。

作为上表数据的示例,我需要的输出是

primaryKey   id    activity   template  creator  created
1            1      3           5         x       2011-10-13
2            2      4           2         y       2011-10-15  
3            2      4           7         z       2011-10-24

(因为记录3和4具有相同的组合,我只想记录3,因为它是第一次出现)

我可以使用单个SQL语句执行此操作吗?

3 个答案:

答案 0 :(得分:6)

SELECT primarykey, id, activity, template, creator, created FROM (
    SELECT *, row_number() OVER (partition BY id, activity, template ORDER BY created) as rn FROM table
) a 
WHERE rn = 1

答案 1 :(得分:0)

这适用于MS SQL Server。

更新了,因为我犯了一个小错误!

SELECT DISTINCT 
        ROW_NUMBER() OVER (ORDER BY 
                                id    
                            ,   activity   
                            ,   template  
                            ,   creator  
                            ,   created ) PrimaryKey

    ,   id    
    ,   activity   
    ,   template  
    ,   creator  
    ,   created 
    FROM 
    [TABLE_NAME]
    GROUP BY 

        id    
    ,   activity   
    ,   template  
    ,   creator  
    ,   created 

答案 2 :(得分:0)

我认为这应该有效 -

SELECT * 
FROM TABLE
WHERE 
 primaryKey in 
 (
   SELECT min(primarkyKey) from TABLE 
      group by id, activity, template
 )

这里,首先通过执行group by获取内部查询中的必需列。然后使用每个不同记录的主键min来获取外部查询中的所有列。