2011-06-26 7 views
2

私はテーブルの列の値のパーセンタイルを与える計算フィールドを持っています。そうする最善の方法は何ですか?SQL Server - 別の列の百分位数値の列を追加する方法?

私はランダムに分布した0から10000までの範囲の値を含む1つの列を持つテーブルを持っています。別の列を追加して、元の列の他のすべての値に対して、同じ行の値のパーセンタイルが何であるかを教えてください。

http://onlinestatbook.com/chapter1/percentiles.htmlで説明されているパーセンタイルの定義が2つあります。

私が知っていた定義を使用しています。例:値が25パーセンタイルの場合、人口の25%がATまたはその値より低いことを意味します。

私が考えていたアルゴリズムは、私は誰かが私はSQLの初心者ですので、私のためにSQLにそれを翻訳することを願って、以下の通りです:値が以下の場合、私のテーブル内のすべての行については

現在の行に値を渡し、次に++を数えます。表の終わりに、私は部門:分数/行数をパーセンタイルにする。多くの行があるので、それは私にとっては十分正確です。

+0

を返す必要があり、我々は、カラム内の重複があるかどうかを確実に知ることはできますか?また、 "パーセンタイル"という意味の混乱があるようですので、サンプルの入力と出力を追加してクリアすることをお勧めします。 –

+0

@Chris Cunningham:パーセンタイルの意味は次のとおりです。http://en.wikipedia.org/wiki/Percentileはい、SATのスコアに重複があるように、重複があってもかまいません。 – user776676

+0

入力と出力の例を教えてください。数字が1、2、3、4の場合、1の "パーセンタイル"は10か0かと思いますか? –

答えて

5

[問題のコメントを一致させるために編集]:

SELECT Number, 100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*) AS Percentile 
FROM MyTable 

次に、あなたのNumber sがあなたが得る必要がある2、5、10、および14、ある場合:

Number Percentile 
2  25 
5  50 
10  75 
14  100 

は、ここで問題です:場合重複がある場合は、ROW_NUMBERがあなたを台無しにします。あなたのNumber sが2、5、5、および14の場合は、上記のコードはあなたを与える:

Number Percentile 
2  25 
5  50 
5  75 
14  100 

をので...代わりにこれを行います。

SELECT Number, MAX(100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*)) AS Percentile 
FROM MyTable 
GROUP BY Number 

あなたの番号は2、5、5、14であれば、それは

Number Percentile 
2  25 
5  75 
14  100 
+0

@Alex Aza:パーセンタイルは上記と同じです。 –

+0

@Chris Cunningham:あなたの例は、私が理解しているパーセンタイルの意味を反映していません。このリンクを参照してください:http://en.wikipedia.org/wiki/Percentile – user776676

+1

あなたのリンクから: "パーセンタイル(またはcentile)は、あるパーセンテージの観測値が下回る変数の値です。 20パーセンタイルは、観測値の20%が見つかる可能性のある値(またはスコア)です。私の番号5は25パーセンタイルにあり、その下には観測値の25%が見つかります。 –

1

他の行/テーブルに依存する計算カラムを作成することはできません。 MSDNから

引用:

発現はnoncomputed 列名、定数、関数、および 一つ以上のオペレータによって接続されたこれらの任意の組み合わせとすることができます。式 はサブクエリにすることはできません。

クエリを行うことができますしかし

セットアップ:

declare @Test table (Value int) 

insert @Test 
values 
    (1), 
    (2), 
    (3), 
    (4), 
    (5), 
    (7), 
    (10) 

問合せ:

select *, (select sum(Value) from @Test t2 where t2.Value <= t1.Value) * 100.0/sum(Value) over() 
from @Test t1 

結果:

Value  Percentile 
----------- --------------------------------------- 
1   3.125000000000 
2   9.375000000000 
3   18.750000000000 
4   31.250000000000 
5   46.875000000000 
7   68.750000000000 
10   100.000000000000 
+0

私はいくつかの情報を追加しました。カレッジ・ボードの人々がパーセンタイルをどのように計算するのでしょうか?私はテーブルの中で同じことをしたい。 – user776676

+0

@ user776676 - 答えを更新しました。 –

+0

@@ user776676 - これが必要な場合はお知らせください。 –

1
select CAST(SUM(CASE WHEN Number <= 20 
     THEN 1 ELSE 0 END) as float)/COUNT(*) as PercentileFor20 
from Numbers; 
関連する問題