MsSQL как получить значение ближайшего будущего и сумму значения с заданной даты и номера склада в одном запросе

#sql #sql-server #datetime #sum #window-functions

#sql #sql-сервер #дата и время #сумма #окно-функции

Вопрос:

У меня есть следующие данные

введите описание изображения здесь

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

Например. результат должен быть таким (если getdate() = 16-09-2020):

введите описание изображения здесь

Возможно ли это сделать с помощью одного запроса?

Ответ №1:

Вы могли бы использовать только оконные функции:

 select *
from (
    select 
        warehouse, 
        sum(value) over(partition by warehouse) sum_future_value
        value nearest_future_value,
        date  nearest_future_date,
        row_number() over(partition by warehouse order by date) rn
    from mytable
    where date > getdate()
) t
where rn = 1
  

В рамках подзапроса мы фильтруем по будущим датам, вычисляем сумму предстоящих значений по складу и ранжируем записи. Все, что осталось сделать, это отфильтровать более раннюю запись для каждой группы.

Ответ №2:

Вы можете использовать оконные функции и условную агрегацию — после фильтрации:

 select warehouse, sum(value),
       max(case when seqnum = 1 then value end) as nearestfuturevalue,
       min(date) as nearestfuturedate
from (select t.*,
             row_number() over (partition by warehouse order by date) as seqnum
      from t
      where date > getdate()
     ) t
group by warehouse