Сложные значения за предыдущие месяцы

Мой менеджер хочет, чтобы я пересчитал каждый центр, в котором есть заказ. Если центр делает один заказ в течение начала последних двух месяцев, он считается активным в течение следующих двух месяцев с того месяца, в котором был сделан заказ. Пример: если центр «AR238» сделал заказ 1 февраля, то он считается активным в течение следующих двух месяцев. Таким образом, он активен до конца апреля, если не сделает еще один заказ в марте или апреле. Я пытаюсь подсчитать каждый активный центр за каждый месяц, суммируя данные за предыдущие месяцы. Таким образом, если центр сделал заказ в феврале, мне нужно иметь возможность посчитать его за февраль, март и апрель. Пожалуйста, помогите, как это сделать. Также мне нужно, чтобы запрос был включен в уже написанный мной запрос. Этот запрос просто добавит дополнительный столбец в таблицу, которая у меня уже есть из исходного запроса. Я опубликую свой первоначальный запрос ниже.

WITH active_centers AS (
SELECT DateName( month , DateAdd( month , MONTH(dmeorderdate) , 0 ) - 1 ) as Month, 
count(distinct DmeOrderNumberDisplay) as NPWT_Order_Volume,  
count(distinct CenterCode) as NPWT_Active_Centers

FROM [AtHome].[Reporting].[WoundQOrderDetails] w
left join[AtHome].[Reporting].[DimCenter] c on c.CenterSK = w.CenterSK
where DmeOrderDate between '2024-01-01' and GETDATE()
and DmeSignedByProvider = 1
and OrderType = 'NPWT'
and CenterCode is not null
group by DateName( month , DateAdd( month , MONTH(dmeorderdate) , 0 ) - 1 ),MONTH(dmeorderdate)
order by MONTH(dmeorderdate))

-- Этот запрос возвращает каждый месяц, объем заказов за каждый месяц и активные центры за каждый месяц. Активные центры, которые у меня уже есть в этом запросе, учитывают центр только один раз. Мне нужен дополнительный столбец, в котором будет подсчитываться каждый отдельный центр за январь, февраль и март, если заказ был сделан в январе. Если этот центр сделает еще один заказ в феврале, он сбросит цикл, теперь мы будем считать его один раз за февраль, март и апрель. Дополнительный столбец, который я пытаюсь добавить, по сути, является составным.

Пожалуйста, предоставьте минимально воспроизводимый пример с данными образца и желаемыми результатами.

Dale K 24.04.2024 23:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не сохранит ваш запрос в целости и сохранности, как вы надеялись, но я думаю, что вам захочется чего-то подобного. Прежде всего, ваша версия запроса не будет обрабатывать данные за период более 12 месяцев в том виде, в каком они есть. И чтобы получить данные за первые два месяца, вам также нужно оглянуться назад, до начала диапазона отчетности, если я понимаю это требование. Из-за операций count(distinct) вы не сможете предварительно агрегировать, поэтому я думаю, что подзапрос/перекрестное применение — это способ выполнить эту часть таблицы:

 with active_centers as (
    select
        datediff(month, '2024-01-01', DmeOrderDate) as MonthNum,
        DmeOrderDate, CenterCode, DmeOrderNumberDisplay
    from AtHome.Reporting.WoundQOrderDetails as w
        left join AtHome.Reporting.DimCenter c on c.CenterSK = w.CenterSK
    where DmeOrderDate between dateadd(month, -2, '2024-01-01') and getdate()
        and DmeSignedByProvider = 1 and OrderType = 'NPWT' and CenterCode is not null
), report_dates(report_date) as (
    select distinct datetrunc(month, DmeOrderDate)
    from active_centers where MonthNum >= 0
)
select report_date, NPWT_Order_Volume, NPWT_Active_Centers
from report_dates as d cross apply (
    select count(distinct DmeOrderNumberDisplay), count(distinct CenterCode)
    from active_centers as c
    where c.DmeOrderDate >= dateadd(month, -2, d.report_date) and
          c.DmeOrderDate  < dateadd(month,  1, d.report_date)
) as cnt(NPWT_Order_Volume, NPWT_Active_Centers)
order by report_date;

Поскольку в столбце даты заказа, вероятно, есть индекс, я надеюсь, что этот индекс будет эффективно использоваться в цикле.

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

with monthly_centers as (
    select
        datediff(month, '2024-01-01', DmeOrderDate) as MonthNum, w.CenterCode,
        count(*) as OrderVolume
    from AtHome.Reporting.WoundQOrderDetails as w
        inner join AtHome.Reporting.DimCenter c on c.CenterSK = w.CenterSK
    where DmeOrderDate between dateadd(month, -2, '2024-01-01') and getdate()
        and DmeSignedByProvider = 1 and OrderType = 'NPWT'
    group by datediff(month, '2024-01-01', DmeOrderDate), w.CenterCode
)
select distinct dateadd(month, MonthNum, '2024-01-01') as "Month",
    NPWT_Order_Volume, NPWT_Active_Centers
from monthly_centers as mc cross apply (
    select sum(OrderVolume), count(distinct CenterCode)
    from monthly_centers as mc2
    where mc2.MonthNum between mc.MonthNum - 2 and mc.MonthNum
) as lookback(NPWT_Order_Volume, NPWT_Active_Centers)
where MonthNum >= 0
group by MonthNum
order by "Month";

Оба запроса возвращают одни и те же результаты для небольшого набора данных здесь: https://dbfiddle.uk/vOhchhCd

Сообщение 195, уровень 15, состояние 10, строка 10 «datetrunc» не является распознаваемым именем встроенной функции.

niam dickerson 24.04.2024 18:51

Почему он дает мне такой ответ?

niam dickerson 24.04.2024 18:51

@niam К сожалению, я пропустил параметр.

shawnt00 24.04.2024 19:15

Хорошо, я запускаю новый запрос. Почему выполнение этого запроса занимает много времени?

niam dickerson 24.04.2024 19:56

Как долго это? Он неоднократно оглядывается назад на перекрывающиеся периоды времени. Подсчет различных также обычно включает в себя множество дополнительных сортировок.

shawnt00 24.04.2024 19:59

Кстати, у вас действительно есть индекс в этом столбце даты?

shawnt00 24.04.2024 20:06

Это синтаксические ошибки, которые я получаю

niam dickerson 24.04.2024 22:41

Сообщение 207, уровень 16, состояние 1, строка 18. Недопустимое имя столбца «report_month». Сообщение 207, уровень 16, состояние 1, строка 19. Недопустимое имя столбца «report_month». Сообщение 207, уровень 16, состояние 1, строка 14. Недопустимое имя столбца «NPWT_Order_Volumn».

niam dickerson 24.04.2024 22:41

Сообщение 207, уровень 16, состояние 1, строка 18. Недопустимое имя столбца «report_month».

niam dickerson 24.04.2024 22:41

Сообщение 207, уровень 16, состояние 1, строка 19. Недопустимое имя столбца «report_month».

niam dickerson 24.04.2024 22:42

Сообщение 207, уровень 16, состояние 1, строка 14. Недопустимое имя столбца «NPWT_Order_Volumn».

niam dickerson 24.04.2024 22:42

Меня немного смущает индекс по столбцу даты. Я не уверен на 100%, что это значит

niam dickerson 24.04.2024 22:43

Я изменил имя report_date/report_month. Третий был просто опечаткой.

shawnt00 24.04.2024 22:44

@niam Этот запрос завершился в первый раз? Как долго это займет? Сколько у вас данных?

shawnt00 24.04.2024 22:44

Да, это конец. Я не получил никаких данных из-за синтаксиса. Я запустил его второй раз, и это заняло всего несколько секунд, но я получаю синтаксические ошибки.

niam dickerson 24.04.2024 22:48

@niam Эти ошибки вообще помешали бы его запуску. Я считаю, что они все были исправлены.

shawnt00 24.04.2024 22:49

Я вставил в ssms самый последний запрос, который вы мне дали 12 минут назад, он не запустился, а просто вернулся с синтаксическими ошибками.

niam dickerson 24.04.2024 23:02

Запросы исправлены. См. пример выполнения скрипта.

shawnt00 24.04.2024 23:35

Другие вопросы по теме