Есть ли способ найти последнюю дату, которая превышает n дней в SQL?

Я пытаюсь найти, какой актив не был заимствован в течение последних 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

Спасибо всем за вашу помощь! Очень ценил это. Я нашел другой способ решения этого запроса, который заключается в том, чтобы вместо этого найти актив, который был заимствован за последние 90 дней. А затем вычесть его из исходной таблицы активов.

Denzyl 13.12.2020 08:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
158
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать оператор CASE вместе с DATEADD (здесь dd представляет дни), чтобы классифицировать, что заимствовано, а что нет (Решение 1). Затем, если вы хотите показать одно или другое, вы должны переместить условия для проверки этого в пункт WHERE (Решение 2).

Решение 1

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

Решение 2

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 запрос. Есть два условия:

  • Ресурс был создан не менее 90 дней назад.
  • За последние 90 дней возвратов не было.

Это было бы:

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())
                 );

Другие вопросы по теме