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

У меня такой запрос:

DECLARE @DeadDesigns AS TABLE(
 LegacyKey INT
,DesignKey INT
,StatusKey INT
,DesignGroupId UNIQUEIDENTIFIER
)
INSERT INTO @DeadDesigns
SELECT [P].[LegacyKey],[D].DesignKey, [D].[StatusKey], [D].[DesignGroupId] FROM Project AS P
INNER JOIN DesignGroup AS DG ON P.ProjectKey = DG.ProjectKey
INNER JOIN Design AS D ON DG.DesignGroupId  = D.DesignGroupId
WHERE [D].[StatusKey] = 67 --DEAD 

;WITH CTE2 (LegacyKey, DesignKey, StatusKey, DesignGroupId, RN) AS (
SELECT LegacyKey, DesignKey, StatusKey, DesignGroupId,
ROW_NUMBER() OVER (PARTITION BY [LegacyKey], [DesignGroupId] ORDER BY [DesignGroupId]) AS RN
FROM @DeadDesigns 
    GROUP BY [DesignGroupId],[LegacyKey],DesignKey,StatusKey
)
SELECT * FROM CTE2

Структура:

Один LegacyKey может иметь несколько DesignGroupId, а один DesignGroupId может иметь несколько DesignKey

Цель состоит в том, чтобы получить последние DesignKey каждого DesignGroupId отдельно от проекта

Неверный результат:

+-----------+-----------+-----------+--------------------------------------+----+
| LegacyKey | DesignKey | StatusKEy |            DesignGroupId             | RN |
+-----------+-----------+-----------+--------------------------------------+----+
|     14002 |      2416 |        67 | 1A07C80E-E5E2-45F0-A5D2-419BAF3DC106 |  1 |
|     14002 |      2819 |        70 | 1A07C80E-E5E2-45F0-A5D2-419BAF3DC106 |  2 |
+-----------+-----------+-----------+--------------------------------------+----+

Это неверно, поскольку это тот же DesignGroupId, если что DesignGroupId был другим, результат был правильным.

Подробный результат желания:

Я хочу разделить его на DesignGroupId, так что если есть два разных DesignGroupId, и это одно и то же LegacyKey RN второго ряда должно быть 2 .. если у нас 3 DesignGroupId, но то же самое LegacyKey RN второго ряда должно быть 3 и так далее. В конце я хочу получить ВСЕ последние DesignKey внутри каждого DesignGroupId внутри каждого LegacyKey

Что я делаю не так?

Другой пример

+-----------+-----------+-----------+--------------------------------------+----+
| LegacyKey | DesignKey | StatusKEy |            DesignGroupId             | RN |
+-----------+-----------+-----------+--------------------------------------+----+
|     18288 |      3974 |        63 | F18320D8-C7A8-4A2A-AFDE-38A483C24E81 |  1 |
|     18288 |      4096 |       107 | F18320D8-C7A8-4A2A-AFDE-38A483C24E81 |  2 |
|     18288 |      7224 |        66 | F18320D8-C7A8-4A2A-AFDE-38A483C24E81 |  3 |
|     18288 |      4842 |        66 | A18320D8-C7A8-4A2A-AFDE-38A483C24E81 |  1 |
|     18289 |      7325 |        66 | 90C224D9-2514-4294-8DEC-D3EE16EC2D00 |  1 |
|     18289 |      3975 |        63 | 90C224D9-2514-4294-8DEC-D3EE16EC2D00 |  2 |
+-----------+-----------+-----------+--------------------------------------+----+

В этом случае у меня есть два разных LegacyKey, но результат неправильный, потому что он возвращает все RN одного и того же DesignGroupId, а мне нужен только последний. Желаемый результат:

+-----------+-----------+-----------+--------------------------------------+----+
| LegacyKey | DesignKey | StatusKEy |            DesignGroupId             | RN |
+-----------+-----------+-----------+--------------------------------------+----+
|     18288 |      7224 |        66 | F18320D8-C7A8-4A2A-AFDE-38A483C24E81 |  3 |
|     18288 |      4842 |        66 | A18320D8-C7A8-4A2A-AFDE-38A483C24E81 |  1 |
|     18289 |      3975 |        63 | 90C224D9-2514-4294-8DEC-D3EE16EC2D00 |  2 |
+-----------+-----------+-----------+--------------------------------------+----+

Как видите, я получаю последние RN из DesignGroupId, но они совпадают LegacyKey

1 Ответ

1 голос
/ 18 марта 2020

Я бы не ожидал GROUP BY в подзапросе. И я ожидаю фильтрации во внешнем запросе:

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

Обратите внимание, что я изменил ORDER BY на DESC - это типично, когда вы хотите, чтобы «последний» или «последний» что-то .

...