Несколько LAG, чтобы составить LEAD

0

Я не уверен, как это сделать. Вот как структурируются мои данные:

DATE:                Amount                ID
3/5/2018             0                     ABC
3/7/2018             500                   ABC   
3/9/2018             0                     ABC  
3/15/2018            0                     ABC
3/21/2018            500                   ABC
3/21/2018            -1000                 ABC
4/5/2018             0                     DEF
4/7/2018             0                     DEF  
4/9/2018             600                   DEF 
4/15/2018            0                     DEF    
4/21/2018            600                   DEF
4/21/2018            -1200                 DEF

Я ищу, чтобы вытащить даты, когда указана положительная сумма, и когда две (или более) из этих сумм достигли общей суммы (обозначенной отрицательной суммой). THEN, id хотел бы видеть разницу от первой даты, к применяемой дате (отрицательная сумма)

Так ABC будет 3/7/2018 до 3/21/2018 в течение 14 дней, DEF будет 4/9 до 4/21 за 12 дней и т.д.

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

  • 0
    На какой версии mysql вы работаете?
  • 1
    Пожалуйста, покажите пример вывода в виде таблицы
Теги:

2 ответа

0

Вы, кажется, хотите:

select t.*, (grp_amount + amount) as first_difference
from (select t.*,
             min(amount) over (partition by id, grp) as grp_amount,
             row_number() over (partition by id, grp, sign(amount) order by date) as seqnum
      from (select t.*,
                   min(case when amount < 0 then date end) over (partition by id order by date desc) as grp
            from t
     ) t
where amount > 0 and seqnum = 1;

Что это значит?

Для каждой записи он назначает grp. Это дата следующего отрицательного значения. Затем внутри группы определяется отрицательное значение и первая положительная запись. Расчет основан на этой информации.

0

Это то, что вы ищите?

select id, min(date)mindate, max(date)maxdate, datediff(d, min(date), max(date)) days
from #temp
where amount>0
group by id

Ещё вопросы

Сообщество Overcoder
Наверх
Меню