#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть данные для ежедневного использования, как показано ниже.
Мне нужно пополнять продукт при каждом 2000 использовании. Это ожидаемый результат.
Я пытаюсь использовать SUM OVER
запрос, чтобы получить общее ежедневное предыдущее использование, и пытаюсь разделить, чтобы получить несколько 2000.
SELECT Date, Usage,
SUM(Usage) OVER(ORDER BY Date) AS DailyTotal,
CAST(SUM(Usage) OVER(ORDER BY Date) / 2000 AS INT) Div
FROM Transaction
Но я все еще не могу найти, на какую дату я должен пополнить. Как я могу сделать что-то подобное?
Ответ №1:
Вы можете попробовать использовать LAG
оконную функцию с подзапросом.
Настройка схемы MS SQL Server 2017:
create table [Transaction]([Date] date, usage int);
insert into [Transaction] values
('2017-01-01',1373),
('2017-01-02',1387),
('2017-01-03',1509),
('2017-01-04',1523),
('2017-01-05',1537);
Запрос 1:
SELECT Date,
Usage,
DailyTotal,
(CASE WHEN LAG(Div,1,Div) OVER(ORDER BY Date) <> Div THEN 1 ELSE 0 END) div
FROM (
SELECT Date, Usage,
SUM(Usage) OVER(ORDER BY [Date]) AS DailyTotal,
CAST(SUM(Usage) OVER(ORDER BY [Date]) / 2000 AS INT) Div
FROM [Transaction]
)t1
| Date | Usage | DailyTotal | div |
|------------|-------|------------|-----|
| 2017-01-01 | 1373 | 1373 | 0 |
| 2017-01-02 | 1387 | 2760 | 1 |
| 2017-01-03 | 1509 | 4269 | 1 |
| 2017-01-04 | 1523 | 5792 | 0 |
| 2017-01-05 | 1537 | 7329 | 1 |
Комментарии:
1. У меня нет поля пополнения. Пополнение — это ожидаемое поле, которое мне нужно.
2. Какой вы ожидаете результат от ваших выборочных данных?
3. Второе изображение, таблица с дополнительным столбцом пополнения.
4. @VikiTheolorado Хорошо, я понял, вы можете попробовать мой ответ на редактирование 🙂
5. да,
LAG
функция работает. Спасибо. Но в вашем примере используетсяLEAD
вместоLAG
, и это не работает.
Ответ №2:
попробуйте ниже, используя row_number() and comparison
select *,case when DailyTotal<2000*(case when rn=1 then 1 else rn-1 end) then 0 else 1 end
as refill from
(
SELECT Dateval, Usage,
SUM(Usage) OVER(ORDER BY Dateval) AS DailyTotal,
row_number() over(order by dateval) rn
FROM t1
)AA
ВЫВОД:
Dateval Usage DailyTotal rn refill
01/01/2017 00:00:00 1373 1373 1 0
02/01/2017 00:00:00 1387 2760 2 1
03/01/2017 00:00:00 1509 4269 3 1
04/01/2017 00:00:00 1523 5792 4 0
Комментарии:
1. Извините, это не работает. Это работает, если пополнение происходит каждый день. Но я хочу, чтобы пополнение производилось только в том случае, если общее использование (сегодня и предыдущий день) превысит 2000.
2. @VikiTheolorado, я обновил ответ — теперь вы можете проверить
3. Извините @fa06, но это все еще не завершено. При первом и втором пополнении это работает, но не при третьем пополнении, которое должно произойти на пятый день.