2012-06-04 60 views
9

怎麼會這樣(Oracle)的SQL:Rank函數與Order By子句

select a.*, rank() over (partition by a.field1 order by a.field2 desc) field_rank 
from table_a a 
order by a.field1, a.field2 

翻譯成MySQL的?

This question似乎是相似的,但在基本查詢結束時沒有Order By。另外,它是由分區的領域排序的嗎?

+0

我因此未知道qracle這樣可以告訴你喲你想要的結果和樣本數據第一個 –

+0

我可以給一個小的解釋,就像你有列A和B,你以A然後B排序,並且你給出了基於B的每個A組中的每個成員的排名數字。我是對的。 – user1433877

回答

16

根據鏈接你給它應該是這樣的:

SELECT a.*, 
( 
      CASE a.field1 
      WHEN @curType 
      THEN @curRow := @curRow + 1 
      ELSE @curRow := 1 AND @curType := a.field1 END 
     ) + 1 AS rank 
FROM  table_a a, 
      (SELECT @curRow := 0, @curType := '') r 
ORDER BY a.field1, a.field2 desc; 

這裏有兩個小提琴,一個用於Oracle,一個用於MySQL的基礎上,從你給的鏈接的例子:

  1. oracle
  2. Mysql
+1

針對部分分區的漂亮解決方案。但我不知道MySQL是否會到達21世紀並趕上現代SQL特性。 –

+2

+1不錯!謝謝,它的工作原理!我改變的只是在表達式之後沒有寫「+ 1」(它從2開始)。 – user1433877

+0

如果可惜,我不能給多個像... –