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 列のAge値が。のある行で同じであるtag=c and tag=i場合、そのtag=i行を選択しないことです。

行番号 1行目 4の値は同じです(Name,age)=(abc,22)が、行4のタグはiです。
したがって、上記の4行目(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

同じ、および='c'のtag行がすでに存在する場合は、='i'のすべての行を単純に無視できると思います。agenametag

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 に答える