2017-01-05 5 views

答えて

2

あなたがそうのような分析関数のROW_NUMBER()とcount()を使用して中央の行を見つけることができます。

select name, age 
from (
select 
    name, 
    age, 
    row_number() over (order by your_order_by_list) r, 
    count(*) over() c 
from 
    your_table) t 
where r = cast((c + 1)/2 as int); 
1

中央の要素は列の中央値です。これを行うにはいくつかの方法があります。信頼できる方法は次のとおりです。

select avg(age) 
from (select t.*, 
      row_number() over (order by age) as seqnum, 
      count(*) over() as cnt 
     from t 
    ) t 
where seqnum * 2 in (cnt, cnt + 1, cnt + 2); 

これは、偶数行と奇数行の両方で機能します。 「年齢」は数値であると仮定しています(したがって、avg()が機能します)。

+0

は、それはどのように要素の数が奇数の場合には正しい出力を与えるのだろうか?これは2つの値の平均をとり、実際のデータの一部ではない値を返します。 中央値を信頼できる方法で計算するには、パーセンタイル(0.5)関数も使用します。 – Adi

+0

@Adi。 。 。オフ1.リビジョンを表示します。中央値を正しく計算するので、 'percentile_disc()'や 'percentile_cont()'が必要かどうか、そしてそれらが等価を扱う方法を覚える必要はありません。 –

関連する問題