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_rank
与 ties 子句一起使用:
select top (1) with ties t.*
from @JEREIN t
order by dense_rank() over (partition by INVE_KEY order by RECE_KEY desc);
我的 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_rank
与 ties 子句一起使用:
select top (1) with ties t.*
from @JEREIN t
order by dense_rank() over (partition by INVE_KEY order by RECE_KEY desc);