Допустим, у меня есть две таблицы, в которых я пытаюсь сравнить значения дат. По сути, я хотел бы написать набор выражений CASE WHEN, которые будут просеиваться через два столбца даты (обычный столбец даты и столбец оценочной даты) для каждого идентификатора пользователя. Сравнивая эти два столбца даты, я хочу установить sh условия, при которых, если значение даты в столбце обычной даты не равно значению даты оценки, выберите ближайшее значение даты оценки, предшествующее столбцу обычной даты. Второе условие заключается в том, что значения обычной даты и значения оценочной даты равны равному числу дней (например, если одно значение оценочной даты находится за два дня до значения обычной даты, а другое значение оценочной даты - через два дня после обычной даты). выберите значение даты оценки, предшествующее значению обычной даты).
В настоящее время настроено так:
SELECT t1.userID,
--if dates are equal, select the date that matches
CASE WHEN t1.ASSESS_DATE = t2.REG_DATE
THEN (SELECT TOP 1 ASSESS_DATE FROM DB_1.dbo.Table_A -- only want to return one record for each date value
WHERE userID = t2.userID
AND ASSESS_DATE = t2.REG_DATE
ORDER BY REG_DATE ASC) -- not sure if this is needed
--if ASSESS_DATE value is less than or greater than the REG_DATE
--choose nearest ASSESS_DATE value that is before the REG_DATE
ELSE CASE WHEN t1.ASSESS_DATE <= t2.REG_DATE OR t1.ASSESS_DATE >= t2.REG_DATE
THEN (SELECT TOP 1 ASSESS_DATE FROM DB_1.dbo.Table_A
WHERE userID = t2.userID
AND ASSESS_DATE <= t2.REG_DATE
ORDER BY ASSESS_DATE ASC)
-- if two ASSESS_DATES are an equal number of days apart from the REG_DATE,
--choose the ASSESS_DATE value that comes before the REG_DATE
ELSE CASE WHEN DATEDIFF(DAY, t2.REG_DATE, t1.ASSESS_DATE) = ABS(DATEDIFF(DAY, t1.ASSESS_DATE, t2.REG_DATE))
THEN (SELECT TOP 1 ASSESS_DATE FROM DB_1.dbo.Table_A
WHERE userID = t2.userID
ORDER BY ASSESS_DATE ASC)
END
END
END AS ASSESS_DATE, t2.REG_DATE
FROM
(SELECT userID, ASSESS_DATE
FROM DB_1.dbo.Table_A) t1
INNER JOIN
(SELECT userID, REG_DATE
FROM DB_2.dbo.Table_B) t2
ON (t1.userID = t2.userID)
- Примеры таблиц
Таблица A:
userID ASSESS_DATE
---------|-------------
1 2017-01-04
2 2017-03-14
3 2018-05-23
4 2016-07-03
4 2016-07-09
5 2019-04-28
6 2016-10-10
7 2018-11-19
Таблица B:
userID REG_DATE
---------|-------------
1 2017-01-04
2 2017-03-14
3 2018-05-28
4 2016-07-06
5 2019-05-03
6 2016-10-04
7 2018-12-05
Как показано выше, userID's 1 и 2 имеют одинаковые значения ASSESS_DATE и REG_DATE, поэтому их легко сопоставить. userID 3 имеет значение ASSESS_DATE до значения REG_DATE. Значение ASSESS_DATE должно быть связано со значением REG_DATE. userID 4 имеет два значения ASSESS_DATE, оба из которых равны количеству дней, кроме REG_DATE (три дня до и три дня после). Я хочу связать значение ASSESS_DATE, которое приходит ДО значения REG_DATE. userID 5 имеет значение ASSESS_DATE, которое предшествует значению REG_DATE. userID 6 имеет значение ASSESS_DATE, которое следует после значения REG_DATE. Поскольку это единственное значение ASSESS_DATE, записанное для этого идентификатора пользователя, запрос должен выбрать это значение ASSESS_DATE. Наконец, userID 7 имеет значение ASSESS_DATE до REG_DATE, поэтому соедините это значение даты со значением REG_DATE.
Мне бы хотелось, чтобы финальный стол выглядел следующим образом:
userID ASSESS_DATE REG_DATE
--------|-------------|-------------|
1 2017-01-04 2017-01-04 -- Values are equal
2 2017-03-14 2017-03-14
3 2018-05-23 2018-05-28 -- ASSESS_DATE is prior to REG_DATE
4 2016-07-03 2016-07-06 -- Choose the ASSESS_DATE value that comes before REG_DATE
5 2019-04-28 2019-05-03
6 2016-10-10 2016-10-04
7 2018-11-19 2018-12-05
В этом его суть. Я надеюсь, что за запросом легко следовать с учетом комментариев. Спасибо за любую предоставленную помощь.