Я не уверен, как это сделать. Вот как структурируются мои данные:
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 дней и т.д.
Я чувствую, что это может быть раздел строки, но я не могу понять, как это сделать, когда он может охватывать несколько месяцев с несколькими суммами.
Вы, кажется, хотите:
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
. Это дата следующего отрицательного значения. Затем внутри группы определяется отрицательное значение и первая положительная запись. Расчет основан на этой информации.
Это то, что вы ищите?
select id, min(date)mindate, max(date)maxdate, datediff(d, min(date), max(date)) days
from #temp
where amount>0
group by id