41

私はmssqlのRANKING関数を読んでいました。NTILE()以外の他の関数を理解しています。私がこのデータを持っているかどうかをしましょう:

   StudentID     MARKS  
      S1           75  
      S2           83
      S3           91
      S4           83
      S5           93  

だから私がやったらNTILE(2) OVER(ORDER BY MARKS desc)結果はどうなるのか、そしてその理由は?
そして、それがNTILE(3)?簡単な説明は誰ですか?

4

5 に答える 5

42

これをバケットと考えてください。NTILE(2)は2つのバケットを作成し、行の半分は値1になり、残りの半分は値2になります。

create table  #temp(StudentID char(2),    Marks  int) 
insert #temp  values('S1',75 ) 
insert #temp  values('S2',83)
insert #temp  values('S3',91)
insert #temp  values('S4',83)
insert #temp  values('S5',93 ) 


select NTILE(2) over(order by Marks),*
from #temp
order by Marks

これが出力です。行数が不均一であるため、バケット1にはさらに1行あります。

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S5  93

もう1行追加すると

insert #temp  values('S6',92 ) 

これで、両方のバケットに3つの行があります

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S6  92
2   S5  93

実際には、本番コードでNTILEを使用したことはありませんが、結果をn個のバケットに分割する必要がある場合の使用法を確認できます。

于 2013-01-16T09:51:23.413 に答える
18

データをマークの降順で並べてから、2つのグループに分割します。

データを等しいグループに分割できない場合、最初のいくつかのグループには、後者のグループよりも多くの行があります。

したがって、NTILE(2)はあなたに

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           1
      S4           83           2
      S1           75           2 

同様に、NTILE(3)はあなたに

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           2
      S4           83           2
      S1           75           3  
于 2013-01-16T09:47:09.447 に答える
7

私はNTILEを頻繁に使用して、10/10/80テスト用にメーリングリストをバケットに分割しています。たとえば、電子メールの件名をテストしていて、2つのオプションのいずれかをリストのそれぞれの10%に送信し、パフォーマンスの高い方を残りの80%に送信したいとします。

SELECT [フィールドリスト]、(NTILE(10)OVER(order by newid()))-1ASセグメントFROM[データ]

「newid()による順序」はランダムな順序を保証します。「[NTILE...]-1」構文は、整数演算の代わりにテキスト解析を行うために使用する他のツールの直接の結果であるため、結果を1〜10ではなく0〜9で実行する方が簡単でした。 。セグメントフィールドには0〜9の値が入力されます。これを使用して、レコードの10%を非常に簡単に分離できます。また、複数の取り組みを行うキャンペーンでは複数回使用できます。

複製可能な結果を​​含むクエリが必要な場合は、「order by」句で決定論的なものを使用するか、orderby句に使用するGUIDを含む列を追加する必要があります。

PARTITION BY句は、状態、職業、またはその他の事前定義されたグループ化、つまりNTILE(10)OVER(PARTITION BY State ORDER BY newid())などに基づいてバケットのグループを作成するために使用されます。ORDERBY句は必須だと思います。PARTITIONBYはオプションです。

于 2013-12-09T16:12:23.553 に答える
0

Ntile関数では、最初に行数をカウントし、ntileで渡されたパラメーターで除算し、商に従って行の等しいグループを作成してランク付けします。その後、残りの行は各グループによって上からシフトして分散されます。そして、最小の行からは取得しません。たとえば、group1に4つの行がある場合、最後の行ではなく、グループ内の5番目の行を取得します。

ありがとう

于 2015-02-12T08:30:47.863 に答える
0

パーティション句を使用せずにNtileを使用する場合は、ntile(number)の数値に基づいてデータセットを分割し、次のようにします。行の数が7の場合、例:1,1,1,2,3,4,5 ntile(3) 3,2,2を与える。どうやって3,2,2を手に入れましたか?最初に7を6と仮定し(均等にするために1つ少なく)、6/3は2,2,2を与え、次に+を追加します!最初のパーティションに。行数が偶数であれば問題ありません。データセットを分割するだけです

Ntileは、partition句を使用して、データセット内の値に基づいてデータセットを次のように分割します。行が7の場合、行の値の例は次のようになります。1,1,1,2,3,4,5 then:ntile(3)partitioned値で与えると:1,2,3,1,1,1,1。どうやってこれを手に入れたの?まず、値に基づいてデータセットを分割します。ここで、1,1,1は1つのパーティションであり、次にすべての値が異なるパーティションを形成します。次に、各パーティションにntileランクの割り当てを開始します。ここで、1,1,1は1,2,3になり、次のパーティションに進みます。ntile()関数で指定された数までのみランクをプルできます。

于 2015-04-09T06:17:03.353 に答える