1

我有一张如下表

No. FName Age  Tag
1    abc   22    c
2    xyz   60    c
3    pqr   62    i
4    abc   22    i
5    abc   32    i

我希望结果返回为

No. FName Age  Tag
1    abc   22    c
2    xyz   60    c
3    pqr   62    i
5    abc   32    i

要求是,如果列Name AND列的Age值与 , 的行相同,则不应选择tag=c and tag=i该行。行号 1 和行号。4 具有相同的值,但第 4 行的标签 = i。所以上面的第 4 行必须省略。我怎样才能做到这一点 ?tag=i

(Name,age)=(abc,22)
(abc,22,i)

4

2 回答 2

6
WITH records
AS
(
    SELECT  No, FName, Age, Tag,
            ROW_NUMBER() OVER (PARTITION BY FName, Age
                                ORDER BY Tag ASC) rn
    FROM    tableName
    WHERE   TAG IN ('c','i')
)
SELECT  No, FName, Age, Tag
FROM    records
WHERE   rn = 1

如果您有其他特殊值TAG

WITH records
AS
(
    SELECT  No, FName, Age, Tag,
            ROW_NUMBER() OVER (PARTITION BY FName, Age
                                ORDER BY CASE WHEN TAG = 'c' THEN 0 ELSE 1 END ASC) rn
    FROM    tableName
    WHERE   TAG IN ('c','i')
)
SELECT  No, FName, Age, Tag
FROM    records
WHERE   rn = 1
ORDER   BY No

更新 1

SELECT Fname, Age, MIN(tag) Tag
FROM   TableName
WHERE  TAG IN ('c','i')
GROUP  BY Fname, Age
于 2013-03-04T05:01:10.997 回答
4

我认为您可以简单地忽略所有带有tag= 'i' 的行,如果已经存在相同的行agename并且tag= 'c' :

select * from TableName t1
where not exists 
          (select 1 
           from TableName 
           where FNAme = t1.FNAme and Age = t1.Age and t1.Tag = 'i' and tag = 'c')
于 2013-03-04T05:25:20.270 回答