2016-05-07 2 views
0

Как распечатать все читатели, где время между двумя последними занимает больше 2 месяцев?SQL выбрать библиотеку базы данных

Model

select 
    name, surname, max(k1.borrow_date) 
from 
    k_person 
join 
    k_reader using(person_id) 
join 
    k_rent_books k1 using(reader_id) 
join 
    k_rent_books k2 using(reader_id) 
where 
    months_between(add_months((k1.borrow_date),-2),k2.borrow_date) > 2 
group by 
    name, surname, person_id 
order by 
    surname; 

Но я не знаю, как сказать, что сравнивать две последние даты. Спасибо за помощь.

ответ

1

Из-за некоторых ограничений с предложением USING (например, ORA-25154) мне пришлось переключить синтаксис соединения, но вот один из вариантов. В основном способ найти последние и вторые последние даты Заимствования для читателя следующим образом:

  1. Присоединяйтесь к одной копии таблицы K_RENT_BOOKS (K_RB1) и находит строку с последней BORROW_DATE для текущего читателя (от K_READER).
  2. Затем он присоединяется ко второй копии K_RENT_BOOKS (K_RB2), снова для текущего читателя и находит последний BORROW_DATE, который не является , найденным в первом экземпляре (K_FB1).
  3. Сохраните результирующую объединенную запись, если последняя сумма займа равна двум месяцам после второй последней даты заимствования.

-

select k_p.name, k_rb1.borrow_date, k_rb2.borrow_date 
    from k_person k_p 
     inner join 
     k_reader k_r 
      on k_p.person_id = k_r.person_id 
     inner join 
     k_rent_books k_rb1 
      on k_rb1.reader_id = k_r.reader_id 
     inner join 
     k_rent_books k_rb2 
      on k_rb2.reader_id = k_r.reader_id 
where k_rb1.borrow_date = (select max(borrow_date) 
           from k_rent_books k_rb3 
          where k_rb3.reader_id = k_r.reader_id 
          ) 
    and k_rb2.borrow_date = (select max(borrow_date) 
           from k_rent_books k_rb4 
          where k_rb4.reader_id = k_r.reader_id 
           and k_rb4.borrow_date <> k_rb1.borrow_date 
          ) 
    and months_between(k_rb1.borrow_date, k_rb2.borrow_date) > 2 

Есть другие способы сделать это, что может быть быстрее (например, используя пункт with, который генерирует последние и вторые последние даты Заимствования для всех читателей), но, надеюсь, это обеспечивает отправная точка.

Смежные вопросы