如果列值与先前行不同,请选择行

Mud*_*san 1 sql t-sql sql-server sql-server-2005

我有一张如下表

No. FName Age  Tag
1    abc   22    c
2    xyz   60    c
3    pqr   62    i
4    abc   22    i
5    abc   32    i
Run Code Online (Sandbox Code Playgroud)

我希望结果返回为

No. FName Age  Tag
1    abc   22    c
2    xyz   60    c
3    pqr   62    i
5    abc   32    i
Run Code Online (Sandbox Code Playgroud)

要求是,如果一列Name Age值相同的行用tag=c and tag=i,比tag=i排应该不会被选中.

排号 1和行号.4具有相同的值(Name,age)=(abc,22)但行4具有tag = i.
因此(abc,22,i),必须排除上面的第4行.我怎样才能做到这一点 ?

Joh*_*Woo 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
Run Code Online (Sandbox Code Playgroud)

如果您有其他特殊值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
Run Code Online (Sandbox Code Playgroud)

更新1

SELECT Fname, Age, MIN(tag) Tag
FROM   TableName
WHERE  TAG IN ('c','i')
GROUP  BY Fname, Age
Run Code Online (Sandbox Code Playgroud)