Return 只有具有最大键的行

Return only rows with maximum key

我的 table 中有两列:

- RECE_KEY
- INVE_KEY

我只想 return 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 |
+----------+----------+

对于整个 table 预期结果将是:

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

我试图解决这个分组和where 条件但没有成功。我想我错过了什么?

示例 table 如下:

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)

您可以使用 rank window 函数查找每个 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

第一选择是ranking函数,但你也可以使用corretalted 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_rankties 子句一起使用:

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