У меня есть запрос, который поначалу работал хорошо, но требует небольшой настройки. Там, где я нахожусь прямо посреди этого, у меня есть полный блок ума на настройке, поэтому я выкидываю его туда за помощью! :)
Как часть большего хранимого процесса, этот раздел уходит в таблицу MarketDataHistory
, чтобы получить столбцы для lastBusnessDay
, lastWeekEnd
(| пятница / рабочий день) и lastMonthEnd
.
Я использовал CASE
для назначения целого числа (1
для lastBusinessDay
, 2
для lastWeek
и 3
для lastMonthEnd
, а затем 4
для всего остального, такого, что мы можно выбрать только IN (1,2,3)
на внешней SELECT
.
Это выглядело круто, за исключением того, что я потом заметил на тестировании на прошлой неделе, что lastWeek и lastMonthEnd были оба 31 мая, а затем я пропустил значения дальше по линии (нам всегда нужны столбцы для всех 3 позже).
DECLARE @date DATETIME = GETDATE()
SELECT @lastBusinessDay = (CONVERT(VARCHAR(10), DATEADD(DAY,
(CASE DATENAME(WEEKDAY, convert(date,@date))
WHEN 'Sunday' THEN -2
WHEN 'Monday' THEN -3
ELSE -1
END),
CONVERT(DATE, @date))) + ' 00:00:00.000')
DECLARE @mydate datetime
SELECT @lastWeek = DATEADD(day, (DATEDIFF (day, '19990102', @DATE) / 7) * 7, '19990101') as friday_before_mydate
SELECT @lastMonthEnd = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1);
Ranked AS
(SELECT ISIN
--,[DATE]
,GRP
,ROW_NUMBER() OVER (PARTITION BY date, grp ORDER BY t.isin) AS [ROWNUMBER]
,COALESCE(ISNULL(TRY_CAST(BID_SPREAD AS FLOAT) + TRY_CAST(ASK_SPREAD AS FLOAT),0) / 2, 0) AS CLOSE_BIDASKAVG
,COALESCE(ISNULL(TRY_CAST(ASK AS FLOAT) + TRY_CAST(BID AS FLOAT),0) / 2, 0) AS CLOSE_PRICEAVG
,COALESCE(ISNULL(TRY_CAST(ASK_YIELD AS FLOAT) + TRY_CAST(BID_YIELD AS FLOAT),0) / 2, 0) AS CLOSE_YIELDAVG
FROM (SELECT *, (CASE WHEN date = @lastBusinessDay THEN 1
WHEN date = @lastWeek THEN 2
WHEN date = @lastMonthEnd THEN 3
ELSE 4
END) as GRP --1 for yesterday, 2 for last week, 3 for last month end and ignore 4 on outer
FROM marketdatahistory
WHERE DATE >= @lastMonthEnd
) t
WHERE GRP IN (1,2,3)
AND isin <> '')
Я был бы признателен, если бы кто-то помог мне преодолеть мой блок разума, ха-ха, с настройкой того, как я справляюсь с 2 из 3 переменных, которые иногда бывают одинаковыми, но всегда возвращают все 3.
Спасибо
Ли Тилли (TilleyTech Ltd)