Использование идентификатора с датами для выбора - проблема, когда lastWeekEnd и lastMonthEnd совпадают - PullRequest
0 голосов
/ 10 июня 2019

У меня есть запрос, который поначалу работал хорошо, но требует небольшой настройки. Там, где я нахожусь прямо посреди этого, у меня есть полный блок ума на настройке, поэтому я выкидываю его туда за помощью! :)

Как часть большего хранимого процесса, этот раздел уходит в таблицу 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)

1 Ответ

1 голос
/ 10 июня 2019

Если желаемый результат состоит в том, что когда два условия выполняются, вы хотите, чтобы строки появлялись дважды, тогда вам нужно объединение, а не case. Сосредоточение на вашем внутреннем SELECT:

FROM (SELECT M.*, G.GRP
FROM marketdatahistory AS M
INNER JOIN (
--1 for yesterday, 2 for last week, 3 for last month end
    SELECT 1 AS GRP, @lastbusinessday as D UNION ALL
    SELECT 2 AS GRP, @lastWeek as D UNION ALL
    SELECT 3 AS GRP, @lastMonthEnd as D
) AS G
ON M.DATE >= @lastMonthEnd
AND M.DATE = G.D
) t

Поскольку вы все равно собираетесь исключить группу 4, просто не определяйте эти строки вообще; вот почему я оставил это вне моего внутреннего выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...