【问题标题】:Return only rows with maximum key仅返回具有最大键的行
【发布时间】:2018-09-10 09:35:48
【问题描述】:

我的表中有两列:

- RECE_KEY
- INVE_KEY

我只想返回 RECE_KEY 最大的 INVE_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 |
+----------+----------+

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

示例表如下:

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)

【问题讨论】:

    标签: sql sql-server tsql select top-n


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    【解决方案2】:

    首选是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_rankties 子句一起使用:

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

    【讨论】:

    • 第一个很好,因为它可以用在任何子查询中。第二个可能是子查询中的问题,因为子查询不允许在未指定 TOP、OFFSET 或 FOR XML 的情况下使用 order by。非常感谢。如果您对上面使用的技术有任何好的链接,请提供。
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2011-08-22
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多