Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL:如何从派生列中选择最大值_Sql_Oracle - Fatal编程技术网

Oracle SQL:如何从派生列中选择最大值

Oracle SQL:如何从派生列中选择最大值,sql,oracle,Sql,Oracle,我有一个表(STUFF),有3列(item、old_值、new_值)。我想检索值变化百分比最高的所有项目。以下查询产生“此处不允许使用组函数”错误。我该如何着手解决这个问题 SELECT item, old_value, new_value, highest_percentage FROM (SELECT item, old_value, new_value, (new_val

我有一个表(STUFF),有3列(item、old_值、new_值)。我想检索值变化百分比最高的所有项目。以下查询产生“此处不允许使用组函数”错误。我该如何着手解决这个问题

SELECT    item, 
          old_value, 
          new_value, 
          highest_percentage
FROM      (SELECT item, old_value, new_value, 
                  (new_value - old_value) / old_value * 100 AS highest_percentage
          FROM    STUFF)
WHERE     highest_percentage = MAX(highest_percentage);
这是桌子

CREATE TABLE STUFF
( item      VARCHAR2(30) PRIMARY KEY,
  old_value     NUMBER(6, 2),
  new_value     NUMBER(6, 2));

INSERT INTO STUFF VALUES('E1',  0.62,  1.78);
INSERT INTO STUFF VALUES('B1',  0.80,  3.28);
INSERT INTO STUFF VALUES('B2',  2.72,  7.36);
INSERT INTO STUFF VALUES('M4',  2.70,  5.65);
INSERT INTO STUFF VALUES('T6',  5.70,  6.65);
INSERT INTO STUFF VALUES('R3',  4.00, 16.40);
INSERT INTO STUFF VALUES('G10',  8.00, 32.80);
理想情况下,我应该有这个输出

ITEM                OLD_VALUE NEW_VALUE HIGHEST_PERCENTAGE       
------------------- --------- --------- ------------------
B1                  0.80      3.28      310                                    
G10                 8.00      32.80     310                                   
R3                  4.00      16.40     310

这在Oracle中称为Top-N查询,您可以像这样执行:

select * from 
    (select * from XXX order by YYY desc) 
  where rownum < N;
要避免额外的子查询,请执行以下操作:

SELECT * FROM 
  STUFF,
  (SELECT max((new_value - old_value) / old_value * 100) AS percentage FROM STUFF) highest
WHERE (new_value - old_value) / old_value * 100 = highest.percentage ;

但是,分析函数似乎是最快的解决方案。

另一种选择是使用窗口函数,在检索数据时计算最大百分比。这可能比使用子查询的解决方案快,因为表只需要访问一次:

with data as (
  SELECT item, 
         old_value, 
         new_value, 
         (new_value - old_value) / old_value * 100 AS highest_percentage,
         max((new_value - old_value) / old_value * 100) over () as max_pct
  FROM STUFF
)
SELECT item, 
       old_value, 
       new_value, 
       highest_percentage
FROM data   
WHERE highest_percentage = max_pct;

如果您不知道有多少行的百分比等于最高百分比,该怎么办?但我事先不知道项目数(N)。在本例中,可能有1个顶级项,或3个类似项。@Anas,组函数不是必需的,因为百分比取决于唯一的行。否则应使用MAX和HAVING。谢谢!这看起来确实更有效率。
with data as (
  SELECT item, 
         old_value, 
         new_value, 
         (new_value - old_value) / old_value * 100 AS highest_percentage,
         max((new_value - old_value) / old_value * 100) over () as max_pct
  FROM STUFF
)
SELECT item, 
       old_value, 
       new_value, 
       highest_percentage
FROM data   
WHERE highest_percentage = max_pct;