Выбор SQL из определенной повторяющейся строки - PullRequest
0 голосов
/ 02 августа 2010

Привет всем, у меня есть запрос 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). Для строк, которые не дублируются, вернуть как обычно.

То есть результаты должны выглядеть следующим образом ...

  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 ]

4 голосов
/ 02 августа 2010

В одну сторону

;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 голос
/ 02 августа 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...