2015-10-13 3 views
0

У меня есть две таблицы в системе управления проектами с этапами, одна (упрощенная) таблица, содержащая идентификатор проекта и фактические даты ворот для каждого затвора, 1-5. В другом случае у меня есть исторический рекорд всех прогнозируемых данных; Прогнозируемый доход, прогнозируемая маржа, прогнозный год и т. Д. Каждый раз, когда прогноз обновляется, он записывает новые значения прогноза, отметку времени изменения и идентификатор проекта. Требование состоит в том, чтобы получить все метрические значения для последнего обновления до фактической даты затвора, записанной в первой таблице. Например, проект 100 имеет дату Gate 2 2014-12-18. Мне нужно получить самые последние значения до этой даты.MAX Дата серии до другой даты сгруппирована

ворот Дата Таблица:

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 с LastUpdated Датой 2014-05-26 поскольку это было последнее обновление до 2014-12-18 годов, а первые шесть строк данных для Project 2000 обновлены 2012-11-23.

Любое руководство будет принята с благодарностью.

ответ

0

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 
+0

Благодарим за быстрый ответ! Кажется, он работает. Теперь я пытаюсь оптимизировать запрос, так как занимает около часа, чтобы вернуть набор результатов. Я думаю, что если я уменьшу начальное выражение таблицы до различных значений LastUpdate, это значительно поможет. Каждый раз, когда прогноз обновляется, добавляется примерно 120 метрик (строк) с одинаковой маркой LastUpdate. Если я ограничу начальную нагрузку на разные даты, я уверен, что она будет намного меньше ударов по функции MAX. – scottM

Смежные вопросы