代码之家  ›  专栏  ›  技术社区  ›  FrenkyB

仅返回键最大的行

  •  2
  • FrenkyB  · 技术社区  · 6 年前

    我的表中有两列:

    - RECE_KEY
    - INVE_KEY
    

    我只想返回rece键最大的inve键的行。

    例子:

    inve_key=1包含在rece_key=1,2,3中。 本例中的max 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 回复  |  直到 6 年前
        1
  •  1
  •   Yogesh Sharma    6 年前

    第一个选择是 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);
    
        2
  •  2
  •   Mureinik    6 年前

    你可以用 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