Получить разные строки из результата выражения CTE - PullRequest
0 голосов
/ 19 марта 2020

У меня есть такой CTE:

DECLARE @LastDesigns AS TABLE
(
    [LegacyKey]       INT
    , [DesignKey]     INT
    , [Folio]         INT
    , [StatusKey]     INT
    , [DesignGroupId] UNIQUEIDENTIFIER
)

INSERT INTO @LastDesigns
    SELECT
        [P].[LegacyKey]
        , [D].[DesignKey]
        , [D].[Folio]
        , [D].[StatusKey]
        , [D].[DesignGroupId]
    FROM EbCorp.dbo.Project AS P
    INNER JOIN EbCorp.dbo.DesignGroup AS DG ON P.ProjectKey = DG.ProjectKey
    INNER JOIN EbCorp.dbo.Design AS D ON DG.DesignGroupId = D.DesignGroupId
    WHERE [D].[IsDeleted] = 0
        AND [ParentDesignGroupId] IS NULL;

WITH CTE2 (
    [LegacyKey]
    , [DesignKey]
    , [Folio]
    , [StatusKey]
    , [DesignGroupId]
    , [RN]
) AS (
    SELECT
        [LegacyKey]
        , [DesignKey]
        , [Folio]
        , [StatusKey]
        , [DesignGroupId]
        , ROW_NUMBER() OVER(PARTITION BY [LegacyKey], [DesignGroupId] ORDER BY [DesignKey] DESC) AS [RN]
    FROM @LastDesigns
)
SELECT
    [LegacyKey]
    , [DesignKey]
    , [Folio]
    , [StatusKey]
    , [DesignGroupId]
FROM CTE2
WHERE [RN] = 1;

Этот запрос возвращает такую ​​информацию:

+-----------+-----------+-------+-----------+--------------------------------------+
| LegacyKey | DesignKey | Folio | StatusKey |            DesignGroupId             |
+-----------+-----------+-------+-----------+--------------------------------------+
|     18233 |      7540 |  5465 |        67 | 25687D54-B109-451B-9386-DD21C24ABBA9 |
|     18233 |      7543 |  5464 |        67 | 25687D54-B109-451B-9386-DD21C24ABBA9 |
|     18233 |      5229 |  4104 |       111 | 7E9F6DC9-6D1F-40DA-9D84-FE4D969A4289 |
|     18234 |      3920 |  2792 |        67 | 44D2DAFB-1880-4B93-AD04-2336B43E5BCA |
|     18234 |      7381 |  5306 |        67 | 7ADF74D6-A915-4882-9AC4-80FD801E9570 |
+-----------+-----------+-------+-----------+--------------------------------------+

Мы концентрируемся только на 2 столбцах: LegacyKey и StatusKey

Как видите, первые три строки имеют одинаковые LegacyKey, но одна из них имеет разные StatusKey.

Я хочу только LegacyKey, где один StatusKey равен 67 и у того же LegacyKey есть еще один ряд с другими StatusKey из 67, это возможно?

Так что в приведенном выше примере я хочу только

  18233 |      5229 |  4104 |       111 | 7E9F6DC9-6D1F-40DA-9D84-FE4D969A4289 |

, поскольку у этого LegacyKey есть другой строки с StatusKey из 67 и последними двумя строками совпадают с LegacyKey, но обе имеют 67 как StatusKey, поэтому я не хочу этого.

1 Ответ

0 голосов
/ 19 марта 2020

Простой / легкий для понимания подход:

SELECT *
FROM cte 
WHERE
  statuskey <> 67 and
  legacykey in (SELECT legacykey FROM cte WHERE statuskey= 67)

Это создает список всех устаревших ключей с ключом состояния 67, а затем ищет все строки, которые не являются ключом статуса 67, но в которых есть ключ legacy. встроенный список

Это также может быть сделано с помощью объединений, существует, даже группировка, но для меня подход IN, вероятно, легче всего читать, понимать и поддерживать

...