#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