【问题标题】:SQL select database librarySQL选择数据库库
【发布时间】:2016-09-02 15:30:21
【问题描述】:

如何打印所有读者,最近两次借阅之间的时间超过 2 个月?

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;

但我不知道怎么说比较两个最后的日期。 感谢您的帮助。

【问题讨论】:

    标签: sql oracle select join aggregate-functions


    【解决方案1】:

    由于 USING 子句的一些限制(例如 ORA-25154),我不得不切换连接语法,但这里有一个选项。基本上,为读者找到最后一个和倒数第二个借阅日期的方法如下:

    1. 加入 K_RENT_BOOKS (K_RB1) 表的一个副本,并找到当前阅读器(来自 K_READER)的最新 BORROW_DATE 的行。
    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 子句为所有读者生成最后一个和倒数第二个借阅日期),但希望这可以提供一个起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2013-08-03
      • 2015-05-31
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多