2013-03-04 71 views
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 

需求是一個表,如果一列NameANDAge列值與tag=c and tag=i行相同,比tag=i行應該不是被選中。

行號1和行號。 4具有相同的值(Name,age)=(abc,22),但第4行的tag = i。
因此,排除(abc,22,i)以上的第4行必須排除在外。我怎樣才能做到這一點 ?

回答

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 
+0

我不能這樣做as使用CASE選擇查詢條件? – 2013-03-04 05:03:13

+0

我已經更新了這個意見 – 2013-03-04 05:05:03

+0

我的意思是這可以在沒有CTE的情況下完成,使用單個select查詢,我可以在where子句中指定條件?我打算使用的是複雜的查詢。 – 2013-03-04 05:12:14

4

我想你可以簡單地忽略與tag所有行= '我',如果已存在一行相同agenametag =「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')