如何检查最低数字列(PL SQL)
Posted
技术标签:
【中文标题】如何检查最低数字列(PL SQL)【英文标题】:How to check lowest numeric column (PL SQL) 【发布时间】:2015-11-24 11:29:59 【问题描述】:返回汽车总购买量最大的邮政编码。由于可能有两个或多个邮政编码并列,因此请确保返回数字最低的邮政编码
表架构:
CREATE OR replace FUNCTION Zip_code_sales_winner
RETURN NUMBER
IS
total NUMBER;
BEGIN
SELECT max(y.[total purchases]) IN total
FROM (
SELECT count(c.zip) AS 'Total Purchases'
FROM customers c
inner join sales s
ON c.cust_id=s.cust_id
inner join vehicles v
ON s.vin=v.vin
GROUP BY c.zip,
v.make) y;
RETURN total;
END
问题是 max 可以返回多个值,而我只想返回 1 个具有最低数字邮政编码的值。我怎样才能做到这一点?
【问题讨论】:
SELECT * FROM (你的子查询) WHERE ROWNUM=1 【参考方案1】:一个简单的选择是在二维中按字典顺序排序,首先按基于 zip 的计数以降序排列,然后按增加的邮政编码
SELECT z.tp
, z.zip
INTO total
, minzip
FROM (
SELECT y."Total purchases" tp
, y.zip zip
FROM (
SELECT count(c.zip) AS "Total purchases"
, c.zip
FROM customers c
inner join sales s
ON c.cust_id=s.cust_id
inner join vehicles v
ON s.vin=v.vin
GROUP BY c.zip,
v.make
) y
ORDER BY y."Total purchases" DESC
, y.zip ASC
) z
WHERE ROWNUM = 1
;
【讨论】:
@Zainulabdeen 可能是因为您在原始代码中使用了[total purchases]
。您还按v.make
分组。
@Zainulabdeen 我删除了一个虚假的右括号并更正了非标准标识符的语法。精简版(当然有不同的表)适合我(在 11g2 上)。
你能发布你的作品吗?当然是你的桌子【参考方案2】:
忘记我之前关于Ceil
和Floor
的帖子。他们在这里没有帮助。
您可以尝试使用另一个选择来确定您查询的最大值(%value%)。
可能是这样的(未经测试):
CREATE OR replace FUNCTION Zip_code_sales_winner
RETURN NUMBER
IS
total NUMBER;
BEGIN
SELECT min(x.Value) IN total from (
SELECT max(y.[total purchases]) Value
FROM (
SELECT count(c.zip) AS 'Total Purchases'
FROM customers c
inner join sales s
ON c.cust_id=s.cust_id
inner join vehicles v
ON s.vin=v.vin
GROUP BY c.zip,
v.make) y) x;
RETURN total;
END
【讨论】:
我想要具有最小数值的邮政编码而不是“总购买量”【参考方案3】:您也可以使用分析函数对行进行排序并获得第一行。
如果您想要每个其他维度(例如每个销售人员)的极端行,这种方法可以很好地扩展 - 只需在 ROW_NUMBER
函数中添加 PARTITION BY
。
with your_query as (
....
),
ordered_query as (
select "Total purchases", zip,
row_number() over (order by "Total purchases" desc, zip) as rn
from your_query
)
select "Total purchases", zip
from ordered_query
where rn = 1
【讨论】:
以上是关于如何检查最低数字列(PL SQL)的主要内容,如果未能解决你的问题,请参考以下文章