Я пытаюсь найти, какой актив не был заимствован в течение последних 90 дней. Логика будет примерно такой
IF latest date of an asset returned_date > 90 days
more than 90 days
ELIF created_date > 90 days
more than 90 days
ELSE
not more than 90 days
Как мне написать все это в один запрос
заем
loan_id asset_id returned_date
1 1 2019-12-14 12:00:00.000
2 1 2019-12-10 12:00:00.000
3 2 2020-11-10 12:00:00.000
объект
asset_id created_date
1 2019-12-05 12:00:00.000
2 2019-12-05 12:00:00.000
3 2019-12-05 12:00:00.000
Вы можете использовать оператор CASE
вместе с DATEADD
(здесь dd
представляет дни), чтобы классифицировать, что заимствовано, а что нет (Решение 1). Затем, если вы хотите показать одно или другое, вы должны переместить условия для проверки этого в пункт WHERE
(Решение 2).
select
t1.asset_id,
t2.returned_date,
case when t2.returned_date > dateadd(dd,90,t1.created_date) then 'more than 90 days'
else 'not more than 90 days'
end as 'borrow window'
from asset t1
join loan t2
on t2.asset_id = t1.asset_id
select t1.*, t2.returned_date
from asset t1
join loan t2
on t2.asset_id = t1.asset_id
where t2.returned_date > dateadd(dd, 90, t1.created_date) -- only > 90
Следующий запрос возвращает только те активы, которые не были заимствованы в течение 90 дней.
Примечания:
select * from( select a.asset_id, l.loan_id, isnull(l.return_date,a.create_date) as return_date, -- ** rank() over(partition by a.asset_id order by l.return_date desc) as rnk -- *** from asset a left join loan l on a.asset_id=l.asset_id )x where rnk=1 -- *** and datediff(day,return_date, getdate())>=90
Если я правильно понимаю, это просто not exists
запрос. Есть два условия:
Это было бы:
select a.*
from asset a
where a.create_date < dateadd(day, -90, getdate()) and
not exists (select 1
from loan l
where l.asset_id = a.asset_id and
l.return_date >= dateadd(day, -90, getdate())
);
Спасибо всем за вашу помощь! Очень ценил это. Я нашел другой способ решения этого запроса, который заключается в том, чтобы вместо этого найти актив, который был заимствован за последние 90 дней. А затем вычесть его из исходной таблицы активов.