В предоставленном запросе, когда дата является последней доступной датой для id
, следующая дата, возвращаемая вашим lead
("NextValue"), будет NULL
.Чтобы заполнить весь путь до вчерашнего дня, когда «NextValue» равно NULL
, вам необходимо изменить ISNULL
, чтобы он заменял NULL
на вчерашнюю дату.
То, как у вас это есть,когда «NextValue» равно нулю, вместо этого возвращается исходная дата, что означает, что для последнего значения в любой серии id
он будет присоединяться к вашей календарной таблице только для точного значения ig.date
исходной записи.
Например, для ID = 111
последняя дата - 27.01.19, поэтому «NextValue» для этой строки будет NULL
.Если вы выбираете из своего CTE напрямую, вы должны увидеть что-то вроде:
ID Date NextValue
111 1/26/18 1/27/19
111 1/27/19 NULL
Когда вы присоединяетесь к своему календарю, ваш ISNULL
эффективно превращает ваши критерии объединения в on c.Date between 1/27/19 and isnull(NULL, 1/27/19)
или on c.Date between 1/27/19 and 1/27/19
, чтоВот почему вы получаете только один ряд для последней записи.
Чтобы решить, измените последнюю строку вашего запроса с:
ISNULL(DATEADD(day,-1,ig."NextValue"),ig."date")
на
ISNULL(DATEADD(day,-1,ig."NextValue"),DATEADD(day,-1,GetDate()))
или
DATEADD(day,-1,ISNULL(ig."NextValue", GetDate()))
(в основном,замените ig.date
на функцию, которая возвращает дату, до которой вы хотите ее заполнить; т.е. вчера).