Рассчитать пополнение при ежедневном использовании

#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, но это все еще не завершено. При первом и втором пополнении это работает, но не при третьем пополнении, которое должно произойти на пятый день.