2011-10-12 84 views
4

我有一個包含商品ID和商品價格的表格。我正在運行Oracle。我想獲得最高價格的ID('s)。獲取最高價格的商品ID

這適用於MySQL,但不適用於Oracle(爲什麼不!)?

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

因爲我將在另嵌套查詢我需要它的工作使用HAVING使用。有任何想法嗎?謝謝!

BTW,產生這個錯誤:

ORA-00920: invalid relational operator 
+0

它可以在MySQL(和PostgreSQL 9.1+),因爲GROUP BY是可選的,和非GROUP BY /聚合包裝列值是任意的(不是很好)。 –

+0

我嘗試使用GROUP BY,但它不會給我預期的結果。 MySQL給了我最高價格的id。但是在Oracle中使用GROUP BY - 給我每個ID的最高價格,所以我有許多結果,而不是1或者可能是2. – jn1kk

+1

@OMGPonies:我現在沒有安裝PostgreSQL 9.1。但我很確定上述查詢不起作用。 'HAVING'表達式必須評估爲布爾值,'MAX(itemprice)'不是這種情況。 –

回答

3

這應該給你的itemid S其中itemprice是最大的不同列表(整個表):

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

我想你是最接近我所尋找的解決方案的人,儘管它並不包括HAVING。謝謝。 – jn1kk

+0

你更受歡迎。 :) – 2011-10-12 01:32:55

+0

@skynorth - 我還應該補充說,如果你真的**想要一個'having'子句,那麼你可以通過itemid選擇itemid from(從main組中選擇itemid,max(itemprice)),它具有max(itemprice )=(從Main中選擇max(itemprice)))通過itemid'(它首先爲每個'itemid'找到最大'itemprice',然後只接受'itemid's,其中'itemprice'等於全局最大值' itemprice'),但是我相信這比上面的查詢慢(或者至少不會更快)。 – 2011-10-12 01:50:13

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()over(由itemid order by itemprice desc分區)',那麼它應該產生相同的結果。 – 2011-10-12 01:46:07

+1

@Jack:naaah,根本不起作用。 itemid是(或者應該是)唯一的,這將導致大小爲1的分區,所有行都將具有rn = 1。但是,** rank()**在這裏需要做什麼。編輯我的答案。 –