У меня следующая проблема: из таблицы платежей и сборов мне нужно найти дату последнего просроченного платежа.Вот таблица и данные, например:
create table t (
Id int
, [date] date
, Customer varchar(6)
, Deal varchar(6)
, Currency varchar(3)
, [Sum] int
);
insert into t values
(1, '2017-12-12', '1110', '111111', 'USD', 12000)
, (2, '2017-12-25', '1110', '111111', 'USD', 5000)
, (3, '2017-12-13', '1110', '122222', 'USD', 10000)
, (4, '2018-01-13', '1110', '111111', 'USD', -10100)
, (5, '2017-11-20', '2200', '222221', 'USD', 25000)
, (6, '2017-12-20', '2200', '222221', 'USD', 20000)
, (7, '2017-12-31', '2201', '222221', 'USD', -10000)
, (8, '2017-12-29', '1110', '122222', 'USD', -10000)
, (9, '2017-11-28', '2201', '222221', 'USD', -30000);
Если значение «Сумма» положительное - это означает, что просрочено началось;если "Сумма" отрицательна - это означает, что кто-то заплатил по этой сделке.
В приведенном выше примере по сделке "122222" просроченная сумма начинается в 2017-12-13 и заканчивается 2017-12-29, поэтомув результате не будет.
А по сделке '222221' первый просроченный платеж 25000, начатый в 2017-11-20, был полностью оплачен в 2017-11-28, поэтому последняя дата текущего просроченного платежа (нас интересует) 2017-12-31
Я сделал этот выбор для суммирования всех платежей и застрял здесь: (
WITH cte AS (
SELECT *,
SUM([Sum]) OVER(PARTITION BY Deal ORDER BY [Date]) AS Debt_balance
FROM t
)
Видимо мне нужно найти (за каждую сделку) минимум дат, если нет 0 или отрицательного значения Debt_balance и следующая дата после последнего 0 баланса в противном случае.
Буду благодарен за любые советы и идеи по этому вопросу. Спасибо!
ОБНОВЛЕНИЕ Моя версия решения:
WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY Deal, [Date]) id,
Deal, [Date], [Sum],
SUM([Sum]) OVER(PARTITION BY Deal ORDER BY [Date]) AS Debt_balance
FROM t
)
SELECT a.Deal,
SUM(a.Sum) AS NET_Debt,
isnull(max(b.date), min(a.date)),
datediff(day, isnull(max(b.date), min(a.date)), getdate())
FROM cte as a
LEFT OUTER JOIN cte AS b
ON a.Deal = b.Deal AND a.Debt_balance <= 0 AND b.Id=a.Id+1
GROUP BY a.Deal
HAVING SUM(a.Sum) > 0