SQL:筛选(行)组(列)中的最大值

时间:2019-06-21 20:11:14

标签: sql

我需要根据月份和位置内版本的最大值过滤行。使用SQL。

例如,我在下面的表格中有6月和纽约的版本1和2,我只希望针对收入为11的版本2的行进行过滤。或者对于1月和纽约,我只希望获得该行收入为15。

Month   Location Version    Revenue
June    NYC     1            10
June    NYC     2            11
June    LA      3            12
January NYC     1            13
January NYC     2            14
January NYC     3            15
January LA      1            16
January LA      2            17

结果:

Month   Location  Version   Revenue
June    NYC        2          11
June    LA         3          12
January NYC        3          15
January LA         2          17

编辑以将列名称更改为Revenue以消除混淆。我不需要最高收入值,只需要与该月最高版本和该位置相关的收入。

3 个答案:

答案 0 :(得分:1)

您还可以将联接用作相关子查询的替代方法,例如:

select t1.* from YourTable t1 inner join
(
    select t2.month, t2.location, max(t2.version) as mv
    from YourTable t2
    group by t2.month, t2.location
) q on t1.month = q.month and t1.location = q.location and t1.version = q.mv

YourTable更改为表格名称。

答案 1 :(得分:0)

一种典型的方法是使用相关子查询进行过滤:

select t.*
from t
where t.version = (select max(t2.version)
                   from t t2
                   where t2.month = t.month and t2.location = t.location
                  );

答案 2 :(得分:0)

使子查询最小化的另一种方法是使用row_number()窗口函数。 (您没有提到您正在使用的 数据库服务器,但其中大多数都支持它。)

SELECT month, location, version, revenue
FROM (SELECT month, location, version, revenue
           , row_number() OVER (PARTITION BY month, location ORDER BY version DESC) AS rn
      FROM your_table)
WHERE rn = 1;