获取没有MAX函数的最新日期... Oracle SQL

时间:2013-10-15 22:37:19

标签: sql oracle plsql

另一项学术任务在现实世界中绝对没有地位......这就是我要做的事情:

•使用带有接受汽车注册的参数的显式游标进行查找 最近在汽车上预订。你将不得不看看 来自I_BOOKING表的date_reserved列。你不能使用 MAX功能。比较所有相关日期以找到最新日期。

老实说,我不知道在MAX(或其他)功能之外如何做到这一点。

到目前为止,我有这个:

CURSOR reg_cr (registration VARCHAR2) IS
SELECT GREATEST (date_reserved)
FROM i_booking;
v_reg reg_cr%ROWTYPE;

如果有人能指出我正确的方向,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

一些只返回一条记录的方法:

SELECT date_reserved
FROM   (SELECT * FROM i_booking
        ORDER BY date_reserved DESC)
WHERE  ROWNUM = 1;

SELECT DISTINCT
       FIRST_VALUE(date_reserved)
       OVER (ORDER BY date_reserved DESC)
FROM   i_booking;

SELECT date_reserved
FROM   (SELECT date_reserved
              ,ROW_NUMBER() OVER (ORDER BY date_reserved DESC)
               AS the_rn
        FROM   i_booking)
WHERE  the_rn = 1;

此方法可能会返回多行(如果第一个位置存在平局):

SELECT date_reserved
FROM   (SELECT date_reserved
              ,RANK() OVER (ORDER BY date_reserved DESC)
               AS the_rank
        FROM   i_booking)
WHERE  the_rank = 1;

wildplasser's answer也展示了此功能。

答案 1 :(得分:1)

尽管赋值的措辞似乎并没有明确排除使用不同的内置函数,但在我看来,精神似乎正在寻找一种循环遍历所有日期值的蛮力方法 - 特别是来自'比较所有相关日期的部分,尽管这仍然是模棱两可的。我想,也取决于你已经学到的东西。

所以这是我对我所认为的任务的看法:

set serveroutput on
declare
  cursor reg_cur (registration i_booking.registration%type) is
    select date_reserved
    from i_booking
    where registration = reg_cur.registration;
  max_date date;
begin
  for reg_row in reg_cur('<reg value>') loop
    if max_date is null or reg_row.date_reserved > max_date then
      max_date := reg_row.date_reserved;
    end if;
  end loop;
  dbms_output.put_line('Most recent date is: ' || to_char(max_date, 'YYYY-MM-DD'));
end;
/

这跟踪到目前为止看到的最新日期,并且在循环的每次迭代中,检查当前光标值是否更新。当然可怕的做法,但这就是你似乎期待的。

还不清楚你应该对这个值做什么; dbms_output也不适合这里的任何现实世界,所以也许你想要一个功能;这是函数形式中相同方法的SQL Fiddle

答案 2 :(得分:1)

最大值表示:没有相应的记录具有更高的值:

SELECT *
FROM orders oo                       -- all orders
WHERE NOT EXISTS (                   -- for which there does not exist
   SELECT * FROM orders nx           -- an order from
   WHERE nx.client_id = oo.client_id -- the same client
   AND nx.order_date > oo.order_date -- ,but with a more recent date
   );