2012-03-17 5 views
0

私は、行の3名を置く場合:Oracleのランク()解析関数

コバチアルバート、コバチDAVID、ナジバラージュ

Surenameはコバチ、ナジある

FamilyNameではアルバート、DAVID、バラージュです

そして、私がの解析関数をFamilynameに実行すると、出力は何になりますか?

1-Kovács Albert 
1-Kovács Dávid 
3-Nagy Balázs 

OR

1-Kovács Dávid 
1-Kovács Albert 
3-Nagy Balázs 

またはそれがランダムになりますか?

私はあなたが私にいくつかの無料オンライン学習インスタンスを与えることができれば、自分のコンピュータにインストールされ何の神託を持っていないあなたはFamilynameに、このようなクエリを実行すると、私は...

+0

実際のテストを行う場合は、無料でOracle XEをダウンロードしてインストールできます。 –

答えて

2

それをいただければ幸いです。あなたはSureNameorder by FamilyNameRANKを行う場合

SELECT 
    RANK() OVER(PARTITION BY FamilyName ORDER BY FamilyName) AS iRank, 
    Surename, 
    FamilyName 
FROM 
    Table1 

:このクエリでは

1-Kovács Albert 
1-Kovács Dávid 
1-Nagy Balázs 

:出力は次のようになります。出力は次のようになります。このクエリでは

1-Kovács Albert 
2-Kovács Dávid 
1-Nagy Balázs 

SELECT 
    RANK() OVER(PARTITION BY Surename ORDER BY FamilyName) AS iRank, 
    Surename, 
    FamilyName 
FROM 
    Table1 
+0

私はSureNameの代わりにForeNameまたはFirstNameを言うべきだと思います。例を読みやすくします –

0

それはあなたが望むものに完全に依存します。提案された結果のいずれかを取得するには、解析句をrank() over (order by surname)にする必要があります。このクエリでは、surnameの昇順に各レコードのrankが表示されます。同じ姓の2人がいるので、その2人の順序は理論的にはでなければなりません。これは、rank()が実際には結果セットの順序付けを行わないため、これを行うにはorder by句が必要です。少なくともあなたが望む結果を保証するために。以下のような

何か:

select rank() over (order by surname asc, familyname asc) as rnk 
    , surname, familyname 
    from my_table 
order by rank() over (order by surname asc, familyname asc) 

このクエリは、昇順姓と姓の順に姓、姓とランクを返します。結果セットが、それは次のようになります。つまり、ランクによって順序付けされます。

1 | Kovács | Albert 
2 | Kovács | Dávid 
3 | Nagy | Balázs 

これは、利益と分析関数の問題です、あなたはあなたがしたいものの中にいます場合には、大規模特定することができあなたが実行したクエリに正確な回答が必要な場合

documentationは、partition by節を使用した別の例です。これをクエリに適用する場合は、surnameでパーティション化し、familynameで注文すると、クエリと結果セットは次のようになります。

select rank() over (partition by surname order by familyname asc) as rnk 
    , surname, familyname 
    from my_table 

2 | Kovács | Dávid 
1 | Kovács | Albert 
1 | Nagy | Balázs 

これは、我々が個別に各姓のためのすべてのfamilynamesをランク付けすることを意味します。 DávidがAlbertの後にあるので、彼はKovácsという姓で2のランクを取得します。 order byを指定しない場合、結果セットを順序付ける必要はありません。