Tsql 分组的另一个日期之前的最大日期系列

Tsql 分组的另一个日期之前的最大日期系列,tsql,max,partition,Tsql,Max,Partition,我有两个表在一个阶段门项目管理系统中,一个简化的表包含一个项目ID和每个门的实际门日期,1-5。另一方面,我有所有预测数据的历史记录;预计收入、预计利润、预测年份等。每次更新预测时,它都会记录新的预测值、变更的时间戳和项目ID。要求检索第一个表中记录的实际关口日期之前最新更新的所有度量值。例如,项目100的大门2日期为2014-12-18。我需要检索该日期之前的最新值 登机口日期表: ProjectID InternalGate2 --------- -------------

我有两个表在一个阶段门项目管理系统中,一个简化的表包含一个项目ID和每个门的实际门日期,1-5。另一方面,我有所有预测数据的历史记录;预计收入、预计利润、预测年份等。每次更新预测时,它都会记录新的预测值、变更的时间戳和项目ID。要求检索第一个表中记录的实际关口日期之前最新更新的所有度量值。例如,项目100的大门2日期为2014-12-18。我需要检索该日期之前的最新值

登机口日期表:

ProjectID     InternalGate2
---------     -------------
100           2014-12-18
2000          2013-01-15
历史度量表:

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-05-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

感谢您的快速回复!它似乎在工作。我现在正试图优化查询,因为返回结果集大约需要一个小时。我认为,如果我将初始表表达式的值降低到不同的LastUpdate值,这将非常有帮助。每次更新预测时,将添加大约120个度量行,所有行都具有相同的LastUpdate戳记。如果我将初始加载限制为不同的日期,我相信对MAX函数的影响会小得多。