2016-10-03 23 views
2

我花了最後2個小時尋找這個,我嘗試過的每一件事都沒有奏效。我有一個table_Sessions我想要返回每個會話的BranchID和平均成本。但我只想顯示前兩名的平均值。如何只顯示前2行?

我已經從字面上嘗試了我所遇到的一切。要麼不適合我的情況,要麼我把它誤撥了。無論哪種方式,我都會在這裏瘋狂。

這裏是我到目前爲止,似乎做什麼,我希望它(最後20%是隻顯示前2最高的平均成本)

SELECT BRANCHID, AVG(SESSIONPRICE) 
FROM SESSIONS 
GROUP BY BRANCHID 
ORDER BY AVG(SESSIONPRICE) DESC; 

,如果有人能約80%請告訴我如何附加到它,我會非常讚賞它。我正在使用Oracle SQL Developer。

感謝

+0

如果有超過2 branchid的分享前兩名AVG(sessionprice)會發生什麼?你仍然只想顯示2行? – Boneist

+0

是的,但我沒有這樣的情況 –

+0

如果這是一個家庭作業問題,那麼它不是一個問題。如果是爲了報告生產系統,那麼它變得更加重要。如果您確實只關心前兩行,並且確實有兩個(或更多)共享前兩個平均會話價格中的一個的情況,您是否關心查詢報告的分支機構是否可能與跑步跑?因爲如果你確實在意,那麼你應該在你的order by子句中引入其他元素,以確保當關系(aka draws)發生時排序是固定的。例如。 'ORDER BY AVG(SESSIONPRICE)DESC,branchid asc' – Boneist

回答

5

在Oracle的新版本(12C以上),你可以使用Fetch First,即:

SELECT BRANCHID, AVG(SESSIONPRICE) 
FROM SESSIONS 
GROUP BY BRANCHID 
ORDER BY AVG(SESSIONPRICE) DESC 
FETCH FIRST 2 ROWS ONLY; 

在長輩的版本,你可以使用rownum。但爲此,我們需要確保您的訂購是首先進行評估的,因此您需要將現有查詢放入子查詢,然後將WHERE子句添加到rownum

例如:

SELECT * FROM 
    (SELECT BRANCHID, AVG(SESSIONPRICE) 
    FROM SESSIONS 
    GROUP BY BRANCHID 
    ORDER BY AVG(SESSIONPRICE) DESC) myQuery 
WHERE rownum <= 2; 

爲ROWNUM的進一步解釋見https://www.techonthenet.com/oracle/questions/top_records.php

+0

是的。第二個例子:使用rownum工作!非常感謝。現在我明白了,我應該知道! Drats。再次感謝! –

5

最近的Oracle版本必須FETCH FIRST

SELECT BRANCHID, AVG(SESSIONPRICE) 
FROM SESSIONS 
GROUP BY BRANCHID 
ORDER BY AVG(SESSIONPRICE) DESC 
FETCH FIRST 2 ROWS ONLY 

對於舊的Oracle版本,使用ROWNUM。大概是這樣的:

select * from 
(
    SELECT BRANCHID, AVG(SESSIONPRICE) 
    FROM SESSIONS 
    GROUP BY BRANCHID 
    ORDER BY AVG(SESSIONPRICE) DESC 
) dt 
WHERE ROWNUM <= 2 
+0

沒有oracle也有rownum?像這樣:'WHERE ROWNUM <= 2' – Roy123

+0

這給了我一個「SQL命令沒有正確結束」,從'FETCH FIRST'的行和行開始。 –

+0

好像你的Oracle版本對於FETCH FIRST來說太舊了。取而代之的是rownum。 – jarlh

2

修訂

SELECT * 
FROM 
    (SELECT BRANCHID, 
      AVG(SESSIONPRICE) 
    FROM SESSIONS 
    GROUP BY BRANCHID 
    ORDER BY AVG(SESSIONPRICE) DESC FETCH FIRST 2 ROWS ONLY) 
WHERE rownum <= 2; 


參考:

+0

這給了我一個「SQL沒有正確結束」的錯誤。開始在'FETCH FIRST'行開始# –

+0

是的,rownum做到了!謝謝 –

+0

@RobBor:檢查此查詢 –

7
SELECT (BRANCHID,AVGPRICE 
FROM (SELECT BRANCHID, AVG(SESSIONPRICE) as AVGPRICE 
FROM SESSIONS 
GROUP BY BRANCHID 
ORDER BY AVG(SESSIONPRICE) DESC) 
WHERE rownum <= 2; 
+0

成功!謝謝 –

1

如果不使用MySQL,請使用SQL LIMIT命令限制結果數量 或SQL TOP。

兩者都做同樣的事情。

如果不使用MySQL,使用SQL LIMIT命令限制結果數量 或SQL TOP。

兩者都做同樣的事情。

與TOP

SELECT TOP 2 BRANCHID, AVG(SESSIONPRICE) 
FROM SESSIONS 
GROUP BY BRANCHID 
ORDER BY AVG(SESSIONPRICE) DESC; 
+2

我不認爲'LIMIT'或'TOP'與Oracle合作 –