2014-01-07 98 views
7

ほとんどのデータベースには中央値を計算するための関数が組み込まれていますが、Amazon Redshiftの中央値は表示されません。AWS Redshiftの中央値の計算方法は?

nth_value()とcount()の解析関数の組み合わせを使用して中央値を計算できますが、それはjankyと思われます。 analytics dbに中央値を計算するためのメソッドが組み込まれていないので、私は何かが不足していると仮定していると私は非常に驚いています。

http://docs.aws.amazon.com/redshift/latest/dg/r_Examples_of_NTH_WF.html http://docs.aws.amazon.com/redshift/latest/dg/c_Window_functions.html

答えて

5

そして、2014年10月17日のように、赤方偏移はMEDIANウィンドウ関数をサポートします。それは理論的には動作するはずのようにそれはそう以来受け入れ答えとしてこれをマークする

# select min(median) from (select median(num) over() from temp); 
min 
----- 
4.0 
+0

より良い回答リンク – Keith

+0

テーブルからの異なるメジアン(フィールド)の選択() –

4

NTILE機能を試してみてください。

データを2つのランク付けされたグループに分け、最初のグループから最小値を選択します。これは、奇数の値を持つデータセットでは、最初のntileは2番目の値より1大きい値を持つためです。この近似は、大規模なデータセットではうまくいくはずです。

create table temp (num smallint); 
insert into temp values (1),(5),(10),(2),(4); 

select num, ntile(2) over(order by num desc) from temp ; 
num | ntile 
-----+------- 
    10 |  1 
    5 |  1 
    4 |  1 
    2 |  2 
    1 |  2 

select min(num) as median from (select num, ntile(2) over(order by num desc) from temp) where ntile = 1; 
median 
-------- 
     4 
+0

を、私は実際にそれをテストしていません。良いアイデア! – tayl0rs

0

私は通常、私は十分に近いの答えを探していた場合に二つのグループにデータを分割するNTILE関数を使用します。しかし、正確な中央値(たとえば、偶数行の中点)が必要な場合は、AWS Redshift Discussion Forumで提案されている手法を使用します。

この手法では、昇順と降順の両方で行が順序付けされ、奇数個の行がある場合は、真ん中の行(つまりrow_num_asc = row_num_desc)の平均値が返されます。自体。

CREATE TABLE temp (num SMALLINT); 

INSERT INTO temp VALUES (1),(5),(10),(2),(4); 

SELECT 
    AVG(num) AS median 
FROM 
(SELECT 
    num, 
    SUM(1) OVER (ORDER BY num ASC) AS row_num_asc, 
    SUM(1) OVER (ORDER BY num DESC) AS row_num_desc 
FROM 
    temp) AS ordered 
WHERE 
    row_num_asc IN (row_num_desc, row_num_desc - 1, row_num_desc + 1); 

median 
-------- 
     4 

偶数の行がある場合は、2つの中間行の平均を返します。

INSERT INTO temp VALUES (9); 

SELECT 
    AVG(num) AS median 
FROM 
(SELECT 
    num, 
    SUM(1) OVER (ORDER BY num ASC) AS row_num_asc, 
    SUM(1) OVER (ORDER BY num DESC) AS row_num_desc 
FROM 
    temp) AS ordered 
WHERE 
    row_num_asc IN (row_num_desc, row_num_desc - 1, row_num_desc + 1); 

median 
-------- 
    4.5 
1

私はこれも難しかったですが、Amazonから助けを得ました。 Redshiftの2014-06-30バージョン以降、これはPERCENTILE_CONTまたはPERCENTILE_DISCウィンドウ関数で実行できます。

彼らは中央値(またはあなたが選んだパーセンタイル)をごとに行に付け加えるので、使用するのが少し奇妙です。それをサブクエリに入れて、中央の列のMIN(または何でも)をとります。

# select count(num), min(median) as median from (select num, percentile_cont (0.5) within group (order by num) over() as median from temp); count | median -------+-------- 5 | 4.0

(それは複雑だ理由は、そのウィンドウ関数は、独自のミニグループ・バイを行い、すべてを一度にあなたに多くのグループの中央値を与えるために注文、および他のトリックすることができます。)

偶数の値の場合、CONT(inuous)は2つの中間値の間を補間します。ここでDISC(rete)はその中の1つを選択します。

関連する問題