MAX Серия от дати преди друга групирана дата

Имам две таблици в система за управление на проекти на сцената, една (опростена) таблица, съдържаща ID на проекта и действителни дати на изход за всеки изход, 1-5. В другата имам исторически запис на всички прогнозни данни; Прогнозирани приходи, прогнозирани маржове, прогнозна година и т.н. Всеки път, когато прогнозата се актуализира, тя записва новите прогнозни стойности, времевия печат на промяната и идентификатора на проекта. Изискването е да се извлекат всички метрични стойности за последната актуализация преди действителната дата на изход, записана в първата таблица. Например, проект 100 има дата на Gate 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

За този пример наборът от резултати ще бъде четирите реда за Project 100 с дата на последна актуализация от 2014-05-26, тъй като това беше последната актуализация преди 2014-12-18 и първите шест реда с данни за Project 2000, актуализиран 2012- 11-23.

Всякакви насоки ще бъдат много оценени.


person scottM    schedule 13.10.2015    source източник


Отговори (1)


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
person Sam cd    schedule 13.10.2015
comment
Благодаря ти за бързия отговор! Изглежда, че работи. Сега се опитвам да оптимизирам заявката, тъй като връщането на набор от резултати отнема приблизително час. Мисля, че ако намаля първоначалния израз на таблицата до отделни стойности на LastUpdate, това ще помогне значително. Всеки път, когато прогнозата се актуализира, се добавят приблизително 120 показателя (реда), всички с един и същ печат LastUpdate. Ако огранича първоначалното зареждане до отделни дати, сигурен съм, че ще бъде много по-малко попадение на функцията MAX. - person scottM; 16.10.2015