第三最近的元素 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 过程性语言;区别是啥?