另一项学术任务在现实世界中绝对没有地位......这就是我要做的事情:
•使用带有接受汽车注册的参数的显式游标进行查找 最近在汽车上预订。你将不得不看看 来自I_BOOKING表的date_reserved列。你不能使用 MAX功能。比较所有相关日期以找到最新日期。
老实说,我不知道在MAX(或其他)功能之外如何做到这一点。
到目前为止,我有这个:
CURSOR reg_cr (registration VARCHAR2) IS
SELECT GREATEST (date_reserved)
FROM i_booking;
v_reg reg_cr%ROWTYPE;
如果有人能指出我正确的方向,我将不胜感激。
答案 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
);