第三最近元素pl/sql oracle

第三最近元素pl/sql oracle,oracle,function,plsql,Oracle,Function,Plsql,我想为以下模式编写一个PL/SQL函数: Parts (pid:integer, pname:string, year:integer, price:integer) Suppliers (sid:integer, sname: string, state:string, zipcode:string) Orders (pid:integer, sid:integer, quantity:integer) 该函数必须执行以下操作: PL/SQL函数,它将价格作为参数,并返回与给定价格第三接近的

我想为以下模式编写一个PL/SQL函数:

Parts (pid:integer, pname:string, year:integer, price:integer)
Suppliers (sid:integer, sname: string, state:string, zipcode:string)
Orders (pid:integer, sid:integer, quantity:integer)
该函数必须执行以下操作:

PL/SQL函数,它将价格作为参数,并返回与给定价格第三接近的零件的pid。请注意,最近值可以是更高或更低。如果该属性有多个部件,请选择年份较高的部件。如果仍然存在平局,请选择pid最高的一个

到目前为止,我还没有这样做,但我不知道如何检测平局情况并对其进行处理:

CREATE OR REPLACE FUNCTION getThirdNearestPriceOfPart(price IN INTEGER)
RETURN Parts.pid%type
IS
    third_pid Parts.pid%type;

BEGIN
    SELECT P1.pid INTO third_pid

    FROM Parts P1

    WHERE (2) = (

            SELECT COUNT(*) FROM Parts P2

            WHERE P2.price > P1.price OR P2.price < P1.price);

    RETURN third_pid;

  EXCEPTION

    WHEN NO_DATA_FOUND THEN

            RETURN -1;
  END;
请帮帮我

PL/SQL函数,它将价格作为参数,并返回与给定价格第三接近的零件的pid

我向您介绍了编写PL/SQL函数部分——但这里有一些编写SQL查询的指南:

首先,计算给定价格与每个零件价格之间的距离相当容易:ABSprice-参考价格 考虑到这一点,您现在可以使用ORDERBY子句按距离排序,然后按年份排序,然后按pid排序 然后可以使用ROWNUM对行进行编号 最后只保留第三排。系件已作为上一个ORDER BY子句的一部分进行处理。 诸如此类:


这听起来很像家庭作业问题。您应该编辑您的问题并添加您尝试过的任何尝试。
SELECT * FROM (
  SELECT ROWNUM RN, V.* FROM (
    SELECT pid, ABS(price - 17.50) distance, price
    FROM Parts
    ORDER BY 2 asc, year desc, pid desc
    ) V
  ) V2
WHERE RN = 3