Вернуть только строки с максимальным ключом

В моей таблице есть два столбца:

- RECE_KEY
- INVE_KEY

Я хочу вернуть только строки для INVE_KEY, где RECE_KEY - макс.

Пример:

INVE_KEY = 1 входит в RECE_KEY = 1,2,3. Максимальное значение RECE_KEY в этом примере равно 3, поэтому правильный результат будет:

+----------+----------+
| RECE_KEY | INVE_KEY |
+----------+----------+
|        3 |        1 |
|        3 |        1 |
|        3 |        1 |
|        3 |        1 |
+----------+----------+

Для всей таблицы ожидаемый результат будет:

+----------+----------+
| RECE_KEY | INVE_KEY |
+----------+----------+
|        3 |        1 |
|        3 |        1 |
|        3 |        1 |
|        3 |        1 |
|        3 |        4 |
|        5 |        5 |
|        5 |        5 |
|        5 |        5 |
+----------+----------+

Я пытался решить эту группировку и условия, но безуспешно. Думаю, я что-то упускаю?

Примерная таблица приведена ниже:

DECLARE @JEREIN TABLE
(
RECE_KEY INT,
INVE_KEY INT
)

INSERT INTO @JEREIN 
VALUES(1,1),(1,1),(1,1),(2,1),(2,1),(3,1),(3,1),(3,1),(3,1),(2,4),(2,4),(3,4),(3,5),(3,5),(5,5),(5,5),(5,5)
2
0
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать оконную функцию rank, чтобы найти верхнюю строку для каждого inve_key:

SELECT rece_key, inve_key
FROM   (SELECT rece_key, inve_key, RANK() OVER (PARTITION BY inve_key ORDER BY rece_key DESC) AS rk
        FROM   @JEREIN) t
WHERE  rk = 1

@FrenkyB вы можете начать с docs.microsoft.com/en-us/sql/t-sql/functions/…

Mureinik 10.09.2018 12:21
Ответ принят как подходящий

Первым выбором будет функция ranking, но вы также можете использовать корретированный suqbuery:

select t.*
from @JEREIN t
where RECE_KEY = (select max(t1.RECE_KEY) from @JEREIN t1 where t1.INVE_KEY = t.INVE_KEY);

Однако вы также можете использовать dense_rank с предложением галстуки:

select top (1) with ties t.*
from @JEREIN t
order by dense_rank() over (partition by INVE_KEY order by RECE_KEY desc);

Первый очень хорош, потому что его можно использовать в любом подзапросе. Второй может быть проблемой в подзапросах, потому что подзапрос не позволяет использовать order by без указания TOP, OFFSET или FOR XML. Большое спасибо. Если у вас есть хорошая ссылка на методы, которые вы использовали выше, пожалуйста, предоставьте.

FrenkyB 10.09.2018 12:01

Другие вопросы по теме