Trogers96 Ответов: 2

В SQL: кол-во битов в качестве подвижного последовательно


Я пытаюсь использовать свой битный столбец "day_business_day_flag" как способ подсчета скользящих рабочих дней в качестве другого значения "rolling_business_day_sequence". day_business_day_flag устанавливается для определения того, является ли день праздником, будним днем/выходным, и возвращает 1, если он не является праздником и не является выходным, и 0, если день является праздничным или выходным. Я пытаюсь установить rolling_business_day_sequence, чтобы либо добавить Предыдущее значение строки для него как своего рода функцию задержки, либо другой способ вычислить, сколько рабочих дней прошло до конкретной даты.
[rolling_day_sequence] = datediff(day,@StartDate,day_date)+1,
Я использую это для подсчета нормальной последовательности скользящих дней. Это начинается с одного и каждый день добавляет еще одно число. Я хочу сделать то же самое с моей колонкой day_business_day_flag

day_business_day_flag-это битовое значение, которое возвращает 1, Если day_date не является выходным/нерабочим днем
rolling_business_day_sequence-это столбец, который я пытаюсь заполнить.
@startdate-01/01/2000
@enddate-это 12/31/2050
day_date-это дата строки, которая может находиться в любом месте между 2000-01-01 и 2050-12-31.
Дайте мне знать, если вам понадобится дополнительная информация, чтобы заставить это работать.
Я получаю "имя столбца или количество предоставленных значений не соответствует определению таблицы." Большую часть времени.

Что я уже пробовал:

Я попробовал это сделать
SELECT rolling_business_day_sequence = COUNT(day_business_day_flag) between @startdate and day_date --WHERE day_date >= @StartDate and day_date <= @EndDate AS rolling_business_day_sequence

Я тоже пытался
SELECT day_date, SUM(CASE WHEN day_business_day_flag = 1 then 1 else 0 END) AS rolling_business_day_sequence FROM CALENDAR_DIM group by day_date;

новая попытка
SELECT day_date, day_business_day_flag, count(day_business_day_flag) FROM CALENDAR_DIM as rolling_business_day_sequence where day_business_day_flag = 1 group by day_date, day_business_day_flag


INSERT INTO CALENDAR_DIM
--SELECT SUM(CASE(day_business_day_flag) WHEN 1 THEN 1 ELSE 0 END) AS rolling_business_day_sequence FROM CALENDAR_DIM


INSERT INTO CALENDAR_DIM
SELECT COUNT(NULLIF(day_business_day_flag,0)) AS rolling_business_day_sequence FROM CALENDAR_DIM



Новая попытка по состоянию на 3 апреля 2019 года

UPDATE [EDW_MDM].[dbo].[FCFCU_CALENDAR_DIM] SET 
	business_day_flag_int = (SELECT CAST(day_business_day_flag AS INT) FROM FCFCU_CALENDAR_DIM), 
	lag_rolling_business_day_sequence = (SELECT LAG(day_business_day_flag, 1) OVER (ORDER BY fcfcu_calendar_dim_id) FROM FCFCU_CALENDAR_DIM)
UPDATE [EDW_MDM].[dbo].[FCFCU_CALENDAR_DIM] SET 
	rolling_business_day_sequence = business_day_flag_int +lag_rolling_business_day_sequence

Я получаю ошибку "подзапрос вернул более 1 значения. Это недопустимо, когда подзапрос следует за=, !=, <, <= , >, >= или когда подзапрос используется в качестве выражения." Когда он запускается как свой собственный, я вижу, что day_date для 01/01/2000 повторяется примерно 200 раз, прежде чем перейти к 01/02/2000. Любые предложения будут очень оценены, потому что я чувствую, что близок к тому, что ищу.

2 Ответов

Рейтинг:
2

#realJSOP

Посмотрите на эту статью: Создание календаря без ранее существовавших таблиц[^]

Если вы не хотите использовать это, просто сделайте это:

UPPER(DATENAME(WEEKDAY, yourDateField )) NOT IN ('SUNDAY','MONDAY') 


чтобы оценить, если это выходной день (вы также можете использовать номер дня, если это ваша склонность).


Рейтинг:
13

Richard Deeming

Если я понял, что вы пытаетесь сделать, что-то вроде этого должно сработать:

UPDATE 
    T
SET
    rolling_business_day_sequence = 1 +
    (
        SELECT Count(1) 
        FROM [EDW_MDM].[dbo].[FCFCU_CALENDAR_DIM] As L
        WHERE L.day_business_day_flag = 1
        And L.day_date < T.day_date
    )
FROM
    [EDW_MDM].[dbo].[FCFCU_CALENDAR_DIM] As T
WHERE
    T.day_business_day_flag = 1
;


Maciej Los

5ed!

Trogers96

Отлично сработало, поставив снизу оператор SET. Маркировка на растворе.

Richard Deeming

Ах, хорошее место! Я исправил свой ответ.