我在下面有这个特殊的表格。我想从第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
修改
我们怎么样? 检查重复记录并仅从一个特定组中删除它。
答案 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提取行,并且仅在程序/课程尚未出现在较低编号组中时才显示。