如何检查最低数字列(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】:

忘记我之前关于CeilFloor 的帖子。他们在这里没有帮助。

您可以尝试使用另一个选择来确定您查询的最大值(%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)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PL-SQL 在 Oracle 中获取列数据类型

PL/SQL Regex 查找最后一个数字并拆分

PL/SQL 正则表达式检查

带有 PL SQL 的序列

PL/SQL 查询结果采用科学计数法,如何改变属性。

检查表是不是重复的过程 - Oracle PL/SQL