2017-06-08 19 views
0

DENSE_RANK()(または類似)を取得して、選択クエリから必要な値を取得できない場合があります。私はRANK()とROW_NUMBER()を試して、PARTITIONフィールドとORDER-BYフィールドを変更しましたが、運はありません。 クエリは次の...T-SQL DENSE_RANK()が期待したものを返さない

SELECT   100 * DENSE_RANK() OVER (PARTITION BY UID_CUSTOMER, INT_GROUP_BY ORDER BY UID_CUSTOMER) AS aINT_GROUP_BY,     
       5 * ROW_NUMBER() OVER (PARTITION BY UID_DIVISION, UID_CUSTOMER,INT_GROUP_BY ORDER BY UID_DIVISION, UID_CUSTOMER, INT_GROUP_BY, INT_SORT_ORDER) AS aINT_SORT_ORDER,     
       UID_DIVISION, UID_CUSTOMER, UID_VEHICLE, INT_GROUP_BY, TXT_GROUP_NAME 
FROM   tVEHICLES TV 
ORDER BY  UID_DIVISION, UID_CUSTOMER, INT_GROUP_BY, INT_SORT_ORDER; 

私はあなたは、3人の異なる顧客がリストされて見ることができるようにUID_CUSTOMER-数のオフセット(列キャプションがリスト表示を狭めるように変更されている)との結果を示します。残りの列に3

6に示す

aGROUP_BY aSORT_ORDER UID_DIVISION UID_CUSTOMER GROUP_BY TXT_GROUP_NAME 
100  5   5    82   100  Group-100 
100  10   5    82   100  Group-100 
100  15   5    82   100  Group-100 
100  20   5    82   100  Group-100 
100  25   5    82   100  Group-100 
100  5   5    86   100  Group-100 
100  10   5    86   100  Group-100 
100  15   5    86   100  Group-100 
100  20   5    86   100  Group-100 
100  25   5    86   100  Group-100 
100  30   5    86   100  Group-100 
100  5   5    88   100  North 
100  10   5    88   100  North 
100  15   5    88   100  North 
100  5   5    88   200  South 
100  10   5    88   200  South 
100  15   5    88   200  South 

二つの列がOVER-構築物から誘導され、私は200ない100フィールドデータのソースであることaGROUP_BY値を期待されていますあなたのご意見やアドバイスは大歓迎です...ジョン

+0

のようなものを試してみてくださいすべての一意のフィールドでパーティション化しているように見えます。つまり、各行は各パーティション内に単独で存在します。あなたは何を返そうとしていますか? 17番目の行が最初のグループか2番目のグループになりますか? –

+0

@PanagiotisKanavosありがとうございました。私はあなたのコメントが何を意味するのか、すべてのフィールドを分割することに関連しているか分かりません。私はUID_CUSTOMERとINT_GROUP_BYのパーティションを参照してください。私はRANK ... OVER ...構造で進歩していないので、何か助けが必要な場合があります - アイテム15,16,17を200にならないようにする100。 –

+0

クエリとデータをクリーンアップし、未使用のフィールドを削除して、同じ名前を使用していることを確認してください。どのフィールドを必要としているのか、そしてどのフィールドを実際に分割するのかは分かりません。 'INT_'のような*すべての*超流動プレフィックスを削除すると、クエリを読みにくくする以外の目的を果たしません。 –

答えて

1

ここにあなたのコードは次のとおりです。

DENSE_RANK() OVER (PARTITION BY UID_CUSTOMER, INT_GROUP_BY ORDER BY UID_CUSTOMER) AS aINT_GROUP_BY, 

次の2つのフィールドで仕切らランク持っている:顧客と「INT_GROUP_BY」 - そう行をデータセット内の13〜17は実際には2つのパーティションを含んでいます。最初は88,100、2番目は88,200です。各グループの順位は1から始まります。そのため、6行すべてで100が表示されます。

はこれにあなたのコードを変更します。INT_GROUP_BYが注文句ではなく、パーティション句であり、そしてあなたが期待する動作が表示されるはずです

DENSE_RANK() OVER (PARTITION BY UID_CUSTOMER ORDER BY UID_CUSTOMER, INT_GROUP_BY) AS aINT_GROUP_BY, 

+0

EXCELLENT - これが答えです。あなたはとても賢いです。このような構造体のPARTITIONとORDER-BYセクションの関係を「見る」方法を教えてくれました。どうもありがとうございました!!! –

0

なぜあなたはそれが1×100、他のものであることを期待したのですか?この

SELECT ROW_NUMBER() OVER (ORDER BY UID_DIVISION, UID_CUSTOMER, INT_GROUP_BY, INT_SORT_ORDER) AS aRowNumber, 
     100 * DENSE_RANK() OVER (PARTITION BY INT_GROUP_BY 
            ORDER BY UID_CUSTOMER 
           ) AS aINT_GROUP_BY,     
     5 * ROW_NUMBER() OVER (PARTITION BY UID_DIVISION, INT_GROUP_BY 
           ORDER BY UID_CUSTOMER, INT_SORT_ORDER 
           ) AS aINT_SORT_ORDER,     
     UID_DIVISION, UID_CUSTOMER, UID_VEHICLE, INT_GROUP_BY, INT_SORT_ORDER, TXT_GROUP_NAME 
FROM  tVEHICLES TV 
ORDER BY UID_DIVISION, UID_CUSTOMER, INT_GROUP_BY, INT_SORT_ORDER; 
関連する問題