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