【问题标题】:SQL: Filter (rows) with maximum value within groups (columns)SQL:过滤(行)在组(列)中具有最大值
【发布时间】:2019-06-21 20:11:14
【问题描述】:

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

例如,我有下面的表格,其中有 6 月和 NYC 的版本 1 和 2,我只想过滤收入为 11 的版本 2 的行。或者对于 1 月和 NYC,我只想获得行收入为 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

编辑以将列名称更改为收入以消除混淆。我不需要收入的最大值,只需要那个月和那个位置的最大版本的收入。

【问题讨论】:

  • 结果中的 1 月 NYC 行是否应该有 15 的值?这似乎是模式(最大值)。结果部分显示 1 月纽约市 3 日和 14 日(而不是 15 日)。
  • 我正在重新阅读这个问题并且很困惑。对于给定的月份和位置,您想要最大版本和值列吗?这就是结果似乎显示的内容,但文本要求提供最大值。你能澄清你在问什么吗?
  • 我很抱歉造成混乱,将列名从价值更改为收入。我只需要最高版本以及随之而来的任何收入。
  • OK - 在这种情况下,我认为您想要相关的子查询答案。我会删除我的答案。

标签: sql


【解决方案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 更改为您的表名。

【讨论】:

  • 这是完美的答案。非常感谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    另一个最小化子查询的方法是使用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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      相关资源
      最近更新 更多