列操作并消除重复

时间:2013-06-26 20:01:34

标签: sql sql-server sql-server-2008 tsql

我在下面有这个特殊的表格。我想从第2组中删除重复的课程,因为它在第1组中。基本上,如果课程映射到必须的第1组,我们必须只考虑而不是在任何其他组中。我将首先检查重复课程,然后删除重复课程,这不是强制性的。


    Program   Group Course     Mandatory
     Program1   1   a          YES
     Program1   1   b          YES
     Program1   1   c          YES
     Program1   2   d          NO
     Program1   2   a          NO
     Program1   2   e          NO
     Program1   3   f          YES  

我无法找出相同的列操作,或者我的思想今天不起作用(:-)) 我已经尝试过使用Count Operation并为重复的行创建一个标志,但不能用' Group'在group by子句中。

输出:

    Program   Group Course     Mandatory
     Program1   1   a          YES
     Program1   1   b          YES
     Program1   1   c          YES
     Program1   2   d          NO
     Program1   2   e          NO
     Program1   3   f          YES  

修改

我们怎么样? 检查重复记录并仅从一个特定组中删除它。

2 个答案:

答案 0 :(得分:3)

您可以使用ROW_NUMBER()函数来实现此目的:

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY COURSE ORDER BY [Group] ) as RowRank
      FROM table
     )sub
WHERE RowRank = 1

演示:SQL Fiddle

编辑:ROW_NUMBER为每一行分配一个数字。对于您通过PARTITION BY部分分配的每个分组,编号将从1开始,在这种情况下,每个COURSE都会有一个数字1然后上升。数字的顺序由ORDER BY部分决定,在这种情况下,最低[Group]得到1。

答案 1 :(得分:1)

编辑我的答案以反映明确的要求。

select *
from @TableName t
where 
    (Mandatory = 'YES' or 
    not exists (
        select * 
        from @TableName 
        where 
            Program = t.Program and 
            Course = t.Course and 
            [Group] != t.[Group] and 
            Mandatory = 'YES'
    ))

根据您在下面的评论,这是另一个尝试

的示例
;with group1 as (
    select * from @Table where [Group] = 1
),
groups12 as (
    select * from group1
    union all
    select * from @Table t where [Group] = 2 and not exists (select * from group1 where Program = t.Program and Course = t.Course)
),
groups123 as (
    select * from groups12
    union all
    select * from @Table t where [Group] = 3 and not exists (select * from groups12 where Program = t.Program and Course = t.Course)
),
groups1234 as (
    select * from groups123
    union all
    select * from @Table t where [Group] = 4 and not exists (select * from groups123 where Program = t.Program and Course = t.Course)
)
select * from groups1234

此查询按顺序为组1-4提取行,并且仅在程序/课程尚未出现在较低编号组中时才显示。