2011-10-12 3 views
4

품목 ID와 품목 가격이있는 테이블이 있습니다. 나는 오라클을 운영하고있다. 가장 높은 가격의 신분증을 갖고 싶습니다.가장 높은 가격의 품목 ID를 받으십시오.

이것은 MySQL에서는 작동하지만 오라클에서는 작동하지 않습니다 (왜!?!).

SELECT Main.itemid 
    FROM Main 
HAVING MAX(Main.itemprice) 

나는 이것을 다른 중첩 된 쿼리에서 사용하므로 HAVING을 사용하여 작동하게해야합니다. 어떤 아이디어? 감사!

BTW,이 오류가 발생합니다 :

ORA-00920: invalid relational operator 
+0

을 (그리고 PostgreSQL을 9.1+)에 GROUP BY는 선택 사항이기 때문에, 및 GROUP BY가 아닌/집계 된 열 값은 임의적입니다 (좋지 않음). –

+0

GROUP BY를 사용해 보았지만 기대 한 결과를 얻지 못했습니다. MySQL은 가장 높은 가격의 이드를 제공합니다. 하지만 Oracle에서 GROUP BY를 사용하면 각 개별 ID에 대해 가장 높은 가격을 제공하므로 1 또는 2 대신 많은 결과가 나타납니다. – jn1kk

+1

@OMGPonies : 현재 PostgreSQL 9.1 설치가 준비 중입니다. 그러나 나는 위의 쿼리가 작동하지 않을 것이라고 확신합니다. HAVING 표현식은 boolean으로 평가되어야합니다. MAX (itemprice)와는 다릅니다. –

답변

3

이 당신에게 (테이블에 걸쳐) itemprice가 최대입니다 itemid의의 별개의 목록을 제공해야합니다 : 그것은 MySQL의 작동

select itemid 
from Main 
where itemprice=(select max(itemprice) from Main) 
group by itemid; 
+0

내가 찾는 솔루션에 가장 가까운 사람이라고 생각합니다. HAVING은 포함되지 않았지만. 감사. – jn1kk

+0

더 이상 환영합니다. :) –

+0

@skynorth - 만약 당신이 ** 정말로 ** having 절을 원한다면, 다음을 추가 할 수 있습니다. itemid를 선택하십시오 (select itemid, max (itemprice) from itemid by max (itemprice) itemid ''(각 itemid에 대해 최대'itemprice'를 먼저 찾은 다음'itemid's 만 취합니다. 여기서'itemprice'는 전역 최대 값과 같습니다.) = (select max (itemprice) from Main) itemprice'), 그러나 이것이 위의 쿼리보다 느리다는 것을 확신합니다 (또는, 적어도 더 빠른 것은 아닙니다). –

2

편집 : rank() 대신 row_number()의 지금을 위해 무엇을 요구하고있다 않습니다해야합니다으로 :
가장 높은 가격으로 모든 항목을 가져옵니다.

SELECT itemid 
    FROM (
    SELECT itemid 
     ,rank() OVER (ORDER BY itemprice DESC) AS rn 
    FROM Main) 
WHERE rn = 1; 
+0

사실, 윈도우 함수를'row_number() (itemid order by item item order by itemprice desc)'로 수정하면 같은 결과가 나옵니다. –

+1

@Jack : naaah, 전혀 작동하지 않습니다. itemid는 고유하거나, 크기가 1 인 파티션을 생성하며 모든 행은 rn = 1을 갖습니다. 그러나 ** rank() **는 여기에 필요한 작업을 수행합니다. 내 대답을 편집했습니다. –

관련 문제