【发布时间】:2021-10-21 09:46:07
【问题描述】:
我的示例源代码如下
declare @t1 as table
(
site varchar(max),
service varchar(max),
yr integer,
mo integer
)
insert into @t1
select *
from
(values
('site1', 'service1', 2021, 1),
('site1', 'service1', 2021, 10),
('site1', 'service1', 2020, 12),
('site1', 'service1', 2019, 9),
('site1', 'service2', 2014, 5),
('site1', 'service2', 2015, 6),
('site1', 'service2', 2016, 7),
('site1', 'service2', 2016, 9),
('site2', 'service3', 2010, 2),
('site2', 'service3', 2011, 1),
('site2', 'service3', 2012, 3),
('site2', 'service3', 2012, 8) ) t (a, b, c, d)
我想编写一个 SQL 查询,该查询将返回一个按站点和服务分组的表,它首先确定什么是 max yr,然后通过先前确定的 max yr 返回 mo 的最大值
我想要的输出如下
| site | service | maxYr | maxMo |
|-------|----------|-------|-------|
| site1 | service1 | 2021 | 10 |
| site1 | service2 | 2016 | 9 |
| site2 | service3 | 2012 | 8 |
我目前可以通过以下方式实现
select
a.site, a.service, a.yr as maxYr, max(a.mo) as maxMo
from
@t1 a
where
exists (select *
from
(select b.site, b.service, max(b.yr) as maxYr
from @t1 b
group by b.site, b.service) c
where a.site = c.site
and a.service = c.service
and a.yr = c.maxYr)
group by
a.site, a.service, a.yr
我想知道是否有更好的方法可以通过单个查询来实现这一点,例如
select
site, service, max(yr) as maxYr,
max(mo) over (partition by site, service order by max(yr)) as maxMo
from
@t1
group by
site, service
如果我需要像Yr-Month-Date 这样进行进一步的聚合,我可能会更容易通过单个查询来实现。
【问题讨论】:
-
假设您有一个同时代表年和月的值(如
日期)。然后,您可以使用单个简单的 MAX 聚合来获取这两个值。所以你需要一个日期(如果我们做出假设,日期部分无关紧要 - 你看到你的吗?)。现在如何从 部分生成日期? -
这能回答你的问题吗? Get top 1 row of each group
标签: sql-server tsql window-functions