使用两列

时间:2017-03-22 15:59:14

标签: sql sql-server max

我有一张类似于此的桌子。我需要选择具有最高年份值和最高月份值的不同供应商编号

VENDORMONTHLY:

id  Vendor    Year     month    More stuff(More columns)
---|---------|-------|-------|---------|
1  | 93000   | 2017  | 3     | sadf    |
2  | 93000   | 2017  | 2     | asdf    |
5  | 93000   | 2017  | 1     | asdf    |
3  | 93000   | 2016  | 12    | fff     |
4  | 93000   | 2016  | 11    | ffff    |
6  | 40000   | 2017  | 2     | fff     |
7  | 40000   | 2017  | 1     | fff     |
8  | 40000   | 2016  | 12    | fff     |

结果看起来像这样。我不能为我的生活提出一个问题,它将给我我需要的东西。

id  Vendor    Year     month    More stuff(More columns)
---|---------|-------|-------|---------|
1  | 93000   | 2017  | 3     | sadf    |
6  | 40000   | 2017  | 2     | fff     |

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

如果您正在使用支持窗口功能的某个数据库(SQL Server,Oracle,Postgres等),您可以row_number(或select * from ( select v.*, rank() over ( partition by vendor order by year desc, month desc ) rn from vendormonthly v ) v where rn = 1; 如果每个供应商每年只需要一行组合)

top with ties

在SQL Server中,使用Select top 1 with ties * From vendormonthly Order by rank() over ( partition by vendor order by year desc, month desc )

可以更好地完成相同的操作
import seaborn.apionly as sns

答案 1 :(得分:1)

快速回答,使用NOT EXISTS验证相同的ID没有其他年份或同一年但后一个月的行:

select v1.*
from VENDORMONTHLY v1
where not exists (select 1 from VENDORMONTHLY v2
                  where v2.Vendor = v1.Vendor
                    and (v2.Year > v1.year
                      or (v2.Year = v1.Year and v2.Month > v1.Month)))

如果是最新的行绑定,将返回两行。

核心ANSI SQL-99。将在任何dbms上运行!