Oracle SQL:如何从派生列中选择最大值
我有一个表(STUFF),有3列(item、old_值、new_值)。我想检索值变化百分比最高的所有项目。以下查询产生“此处不允许使用组函数”错误。我该如何着手解决这个问题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
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;