我需要根据月份和位置内版本的最大值过滤行。使用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以消除混淆。我不需要最高收入值,只需要与该月最高版本和该位置相关的收入。
答案 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;