2013-10-19 17 views
0

美好的一天。 在我的工作中,我發現了一個小問題。我認爲我更糟糕的SQL人。我無法解決兩天。 我有一個小小的sql表,由學生,班級和學校的信息組成,如
我需要每個班級中每個學生的每個新(班級和學校)的序列號。如果沒有PL/SQL
Sql。不同的行號。沒有PL/SQL

 
School  Class   Name 
first  1b    Smith 
first  1b    Jones 
first  1b    Willams 
second  1a    Taylor 
second  1b    Brown 
second  1b    Davies 

和表我需要

 
Number  School  Class Name 
    1   first  1b  Smith 
    2   first  1b  Jones 
    3   first  1b  Willams 
    1   second  1a  Taylor 
    1   second  1b  Brown 
    2   second  1b  Davies 
+0

由SELECT ROW_NUMBER()解決以上(PARTITION BY ORDER BY) –

回答

1

我知道你解決它,但我認爲任何人看這件事希望看到完整的解決方案

SQL小提琴演示: http://sqlfiddle.com/#!4/a6756/8

SELECT 
    row_number() over (partition BY school, class ORDER BY school, class) as nr 
    , s.* 
from students s 

現在計數只有學校和班級。

每當我處理分析功能,我就能把我的頭一下,平時總是引用此頁面,我發現一個很好的教程和記憶複習:http://www.orafaq.com/node/55

編輯:

繼從句話發條 - 木姐我已刪除什麼的解析函數內order by做上述表示,並引述Oracle文檔:

http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm#i81407

order_by_clause生成

使用order_by_clause生成指定 分區中的數據如何排序。對於所有分析函數,您可以在多個密鑰上對 分區中的值進行排序,每個分區由value_expr定義,並且每個 均由排序順序限定。

+0

從技術上講,該'ORDER BY'不會產生穩定的結果(即,後續運行在相同的數據不能保證產生相同的編號);這是因爲它是你的「PARTITION BY」標準。誠然,鑑於RDBMS往往被實施,實際上它可能是穩定的。儘管如此,最好使用提供穩定排序的列(例如'name'),儘管這可能會產生最快的結果。 –

+0

優秀的提示。我做了一個編輯。非常感謝你。 – hol