第三最近的元素 pl/sql oracle

Posted

技术标签:

【中文标题】第三最近的元素 pl/sql oracle【英文标题】:third nearest element pl/sql oracle 【发布时间】:2014-11-29 02:43:34 【问题描述】:

我想为以下模式编写一个 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;

请帮帮我

【问题讨论】:

这听起来很像家庭作业问题。您应该编辑您的问题并添加您尝试过的任何尝试。 【参考方案1】:

PL/SQL 函数将价格作为参数并返回与给定价格第三近的部分的 pid。

“编写一个 PL/SQL 函数”部分由你来决定——但这里有一些编写 SQL 查询的指导:

首先,计算给定价格与每个零件价格之间的距离相当容易:ABS(price - reference_price) 鉴于此,您现在可以使用ORDER BY 子句按距离排序,然后按年份排序,然后按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

见http://sqlfiddle.com/#!4/913b5/15

【讨论】:

以上是关于第三最近的元素 pl/sql oracle的主要内容,如果未能解决你的问题,请参考以下文章

SQL 非过程性语言 T-SQL PL/SQL 过程性语言;区别是啥?

oracle数据库之PL/SQL 块结构和组成元素

Oracle_PL/SQL 集合

PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行

第三章 PL/SQL编程

在 Oracle PL/SQL 中,如何检查 JSON 对象是不是包含特定键的元素