另一个日期分组前的 MAX 日期系列

MAX Date series before another date grouped

我在阶段门项目管理系统中有两个 table,一个(简化)table 包含项目 ID 和每个门的实际门日期,1-5。在另一个我有所有预测数据的历史记录; Projected Revenue、Projected Margins、Forecast Year 等。每次更新预测时,它都会记录新的预测值、更改的时间戳和项目 ID。要求是检索第一个 table 中记录的实际门日期之前的最新更新的所有指标值。例如,Project 100 的 Gate 2 日期为 2014-12-18。我需要检索该日期之前的最新值。

门日期 Table:

ProjectID     InternalGate2
---------     -------------
100           2014-12-18
2000          2013-01-15

历史指标Table:

ProjectID     Metric    MetricYear    LastUpdated    MetricValue
---------     ------    ----------    -----------    -----------
100           Sales     2015          2013-09-05     125000
100           Sales     2016          2013-09-05     230000
100           GM        2015          2013-09-05     .48
100           GM        2016          2013-09-05     .49
100           Sales     2015          2014-05-26     200000
100           Sales     2016          2014-05-26     300000
100           GM        2015          2014-05-26     .50
100           GM        2016          2014-05-26     .51
100           Sales     2015          2015-01-28     300000
100           Sales     2016          2015-01-28     400000
100           GM        2015          2015-01-28     .55
100           GM        2016          2015-01-28     .56

2000          Sales     2014          2012-11-23     200000
2000          Sales     2015          2012-11-23     300000
2000          Sales     2016          2012-11-23     310000
2000          GM        2014          2012-11-23     .75
2000          GM        2015          2012-11-23     .77
2000          GM        2016          2012-11-23     .77
2000          Sales     2015          2013-02-11     450000
2000          Sales     2016          2013-02-11     450000
2000          Sales     2017          2013-02-11     500000
2000          GM        2015          2013-02-11     .68
2000          GM        2016          2013-02-11     .69
2000          GM        2017          2013-02-11     .70

对于此示例,结果集将是项目 100 的四行,最后更新日期为 2014 年 5 月 26 日,因为这是 2014 年 12 月 18 日之前的最后一次更新,前六行数据为项目 2000 更新于 2012 年 11 月 23 日。

任何指导将不胜感激。

如果您愿意,CTE 可以是一个子查询,但这有效,基本上只使用两个连接。

;WITH CTE as 
(select h.ProjectID,MAX(LastUpdated) as LatestUpdate
from Historic h
inner join Gate g
on h.ProjectID = g.ProjectID
and h.LastUpdated <= g.InternalGate2
group by h.ProjectID)

select ProjectID,LastUpdated
from Historic h
inner join CTE c
on h.ProjectID = c.ProjectID
and h.LastUpdated = c.LatestUpdate