【问题标题】:Selecting a column where another column is maximal选择另一列最大的列
【发布时间】:2020-03-02 00:12:55
【问题描述】:

我想这是一个标准问题。但是我还没有找到合适的解决方案。

我在表 A 中有三列:

ID     ID_Version     Var
1        1            A
1        2            A
1        3            X
1        4            D
2        1            B
2        2            Z
2        3            D
3        1            A
4        1            B
4        2            Q
4        3            Z

对于每个唯一 ID,我想隔离属于最大 ID-Version 的 Var-value。

对于 ID = 1,这将是 D,对于 ID = 2,这将是 D,对于 ID = 3,这将是 A,对于 ID = 4,这将是 Z。

我尝试使用 group by 语句,但在 ID-Version 上使用 max-function 并按 ID 分组时无法选择 Var-values。

有没有人知道如何为这个简单的问题编写快速、有效的代码?

【问题讨论】:

    标签: sql oracle greatest-n-per-group


    【解决方案1】:

    你也可以使用一个简单的连接来做你想做的事,见下文:

    SELECT A.id, A.var FROM A
    JOIN
    (SELECT id, MAX(id_version) as id_version
    FROM A
    GROUP BY id) temp ON (temp.id = A.id AND temp.id_version = A.id_version)
    

    或者你也可以使用这样的子查询:

    SELECT a1.id, a1.var FROM A a1
    WHERE a1.id_version = (SELECT MAX(id_version) FROM A a2 WHERE a2.id = a1.id)
    

    【讨论】:

      【解决方案2】:

      Oracle 具有keep 语法,因此您也可以使用聚合:

      select id, max(id_version) as id_version,
             max(var) keep (dense_rank first order by id_version desc) as var
      from a
      group by id;
      

      【讨论】:

        【解决方案3】:

        使用row_number()解析函数:

        select ID,Var from
        (
        select row_number() over (partition by id order by id_version desc) as rn,
               t.*
          from tab t
        )
        where rn = 1
        

        max(var) keep (dense_rank...)

        select id, max(var) keep (dense_rank first order by id_version desc) as var
          from tab 
         group by id
        

        Demo

        【讨论】:

          【解决方案4】:

          你可以使用排名功能:

          SELECT *
          FROM (SELECT tab.*, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID_Version DESC) rn
                FROM tab)
          WHERE rn = 1
          

          【讨论】:

            猜你喜欢
            • 2018-08-25
            • 1970-01-01
            • 1970-01-01
            • 2013-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-29
            相关资源
            最近更新 更多