如何获得黄色以下结果?
我想查找上一年(不包括当前日期)的最高分,并按Name1和Parent1进行分区
我尝试了以下操作,但并没有得到期望的结果,它只返回具有正确分区但在所有日期范围内的最大值。
select
[VDate]
,[Name1]
,[Parent1]
,[Score]
,max(case when [VDate] > dateadd(year, -1, [VDate]) then [Score] else null end) over (partition by [Name1], [Parent1]) AS MaxScoreInPreviousLast12Months
from [dbo].[Control]
表格数据:
CREATE TABLE Control
([VDate] datetime, [Name1] varchar(10), [Parent1] varchar(10), [Score] int);
INSERT INTO Control ([VDate], [Name1], [Parent1], [Score])
VALUES
('2018-08-01 00:00:00', 'Name1', 'Parent1', 80),
('2018-07-01 00:00:00', 'Name1', 'Parent1', 85),
('2018-06-01 00:00:00', 'Name1', 'Parent1', 90),
('2017-09-01 00:00:00', 'Name1', 'Parent1', 100),
('2017-08-01 00:00:00', 'Name1', 'Parent1', 95),
('2017-07-01 00:00:00', 'Name1', 'Parent1', 70),
('2018-08-01 00:00:00', 'Name2', 'Parent2', 80),
('2018-07-01 00:00:00', 'Name2', 'Parent2', 85),
('2018-06-01 00:00:00', 'Name2', 'Parent2', 90),
('2017-10-01 00:00:00', 'Name2', 'Parent2', 60),
('2017-08-01 00:00:00', 'Name2', 'Parent2', 95),
('2017-07-01 00:00:00', 'Name2', 'Parent2', 70),
('2018-08-01 00:00:00', 'Name3', 'Parent3', 80),
('2018-07-01 00:00:00', 'Name3', 'Parent3', 96),
('2018-06-01 00:00:00', 'Name3', 'Parent3', 90),
('2017-10-01 00:00:00', 'Name3', 'Parent3', 96),
('2017-08-01 00:00:00', 'Name3', 'Parent3', 99),
('2017-07-01 00:00:00', 'Name3', 'Parent3', 105)
;
这是用于SQL Server 2016 +
答案 0 :(得分:6)
这是使用外部应用于相关子查询的一种方法。感谢您发布ddl和示例数据。使它变得易于使用。
select c.*
, x.MaxScore
from Control c
outer apply
(
select MaxScore = max(Score)
from Control c2
where c2.VDate < c.VDate
and c2.VDate >= dateadd(year, -1, c.VDate)
and c.Name1 = c2.Name1
and c.Parent1 = c2.Parent1
) x
答案 1 :(得分:3)
类似这样的东西(相关子查询):
select c1.[VDate]
,c1.[Name1]
,c1.[Parent1]
,c1.[Score]
,(select max(c2.score) from [dbo].[Control] c2 where c2.Name1 = c1.Name1 and c2.Parent1 = c1.Parent1 and c2.vdate > dateadd(year, -1, c1.vdate) and c2.vdate < c1.vdate) MS
from [dbo].[Control] c1
答案 2 :(得分:1)
假设您每月只有一排:
select c.*,
max(score) over (partition by name1, parent1
rows between 12 preceding and 1 preceding
) as rolling_max_12
from [dbo].[Control] c;
如果您每个月都没有行,您仍然可以解决问题,但是您的数据似乎有这样的数据。