SQL从特定的重复行中选择

时间:2010-08-02 15:16:48

标签: sql tsql sql-server-2008

大家好我有一个SQL查询

SELECT  FKid1, FKID2, a, b, c
from [source]
where FKID1 = 3

返回以下数据集 (希望格式化)

   FKID1   FKID2   A    B    C
    3   40297    0      0   2
    3   40297    0      100 1
    3   40325    0      0   2
    3   40325    0      0   3
    3   40325    0      10  -1
    3   40348    0      10  3
    3   40391    0      10  -1
    3   40392    0      10  -1
    3   40501    0      10  -1
    3   40501    0      0   2

我正在尝试改进此查询,以便如果有2行具有重复的FKID1和FKID2值,它将从特定行中选择列B值,如下所示...

如果有一行C = -1,则使用此行中的B值并忽略其他行。 如果有2行C<> -1然后选择MAX(B)值。 对于不重复的行,请恢复正常。

IE结果应该如下......

  FKID1   FKID2   A    B    C
    3   40297    0      100 1
    3   40325    0      10  -1
    3   40348    0      10  3
    3   40391    0      10  -1
    3   40392    0      10  -1
    3   40501    0      10  -1

为B列选择的正确值,没有傻瓜。

我们现在有一个解决方案,但我认为它过于复杂,并想知道是否有人有任何想法?

感谢。

2 个答案:

答案 0 :(得分:4)

单程

;WITH cte As
(
SELECT  FKid1, FKID2, a, b, c,
ROW_NUMBER() OVER (PARTITION BY FKID1, FKID2
                   ORDER BY CASE WHEN C = -1 THEN 0 ELSE 1 END ASC, B DESC) AS RN
from [source]
where FKID1 = 3
)
SELECT  FKid1, FKID2, a, b, c 
FROM cte  
WHERE RN=1

答案 1 :(得分:1)

Select T1.FKID1, T1.FKID2
    , Min(A) As A
    , Case
        When Count(*) = 2 And NegCB.B Is Not Null Then Max(NegCB.B)
        Else Max(B)
        End As B
    , Min(C) As C
From Source As T1
    Outer Apply (
                Select T3.B
                From Source As T3
                    Where T2.FKID1 = T1.FKID1
                        And T2.FKID2 = T1.FKID2
                        And T2.C = -1
                ) As NegCB
Where FKID1= 3
Group By T1.FKID1, T1.FKID2