2014-07-26 16 views
1

3 개의 열 (항목, old_value, new_value)이있는 테이블 (STUFF)이 있습니다. 가치 변화율이 가장 높은 항목을 모두 검색하고 싶습니다. 다음 쿼리는 "여기서는 그룹 함수가 허용되지 않습니다"라는 오류를 생성합니다. 이 문제를 해결하려면 어떻게해야합니까? Oracle SQL : 파생 된 열에서 MAX 값을 선택하는 방법

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); 

입니다.

select * from 
    (select * from XXX order by YYY desc) 
    where rownum < N; 

당신의 최신 업데이트에 따르면 - 스칼라 서브 쿼리는이 경우에 도움이 :

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 

답변

1

당신이 할 수있는 오라클의 최고-N 쿼리가 좋아라고

SELECT * FROM STUFF 
    WHERE (new_value - old_value)/old_value * 100 = 
    (SELECT max((new_value - old_value)/old_value * 100) AS highest_percentage 
     FROM STUFF) 

추가 하위 쿼리를 방지하려면 다음을 수행하십시오.

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 ; 

그러나 분석 기능이 가장 빠른 솔루션 인 것 같습니다.

+0

가장 높은 백분율과 같은 백분율을 가진 행 수를 알 수없는 경우 어떻게됩니까? –

+0

그러나 항목 수 (N)를 미리 알지 못합니다. 이 경우에는 1 개의 최상위 항목 또는 3이있을 수 있습니다. – Anas

+0

답변이 업데이트되었습니다. –

1

또 다른 옵션은 데이터를 검색하는 동안 최대 백분율을 계산하는 창 함수를 사용하는 것입니다. 테이블을 한 번만 액세스하면되는 하위 쿼리가있는 솔루션보다 빠릅니다.

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; 
+0

감사! 이것은 실제로보다 효율적으로 보입니다. – Anas