0

現実の世界では絶対に居場所がない、さらにもう 1 つの学問的なタスク...これが私がしなければならないことです。

• 車の登録を受け入れるパラメータで明示カーソルを使用して、車で行われた最新の予約を検索します。ここで I_BOOKING テーブルの date_reserved 列を確認する必要があります。MAX 関数は使用できません。関連するすべての日付を比較して、最新のものを見つけます。

正直なところ、MAX (またはその他の) 関数以外でこれを行う方法がわかりません。

これまでのところ、私はこれを持っています:

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

誰かが私を正しい方向に向けることができれば、私は感謝します.

4

3 に答える 3

2

1 つのレコードのみを返すいくつかのメソッド:

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;

このメソッドは複数の行を返す場合があります (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 の回答もこの機能を示しています。

于 2013-10-16T02:33:55.497 に答える
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です。

于 2013-10-16T09:38:40.533 に答える
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
   ); 
于 2013-10-16T10:19:36.257 に答える