2011-06-26 1 views
5

のavg()をの後で実行できるようにしたいstddevが特定の数を超えていないことを確認してください。これは、完全にPL/SQL問合せとして実行する必要があります。SQLテーブルから上位5つのMAX()値を見つけ、そのテーブルなしでそのテーブルのAVG()を実行する

EDIT: 明確にするために、特定の範囲の値を含み、レイテンシを追跡するデータセットがあります。私は、その値のAVG()が待ち時間の一般的な上昇に起因するのか、非常に高いstddevを持つ少数の値によるのかを知りたいと思います。すなわち、(122,124,111,212)とは対照的に、(1、2、1、3、12311)である。また、私たちの監視ソフトウェアの制限のために、SQLクエリを介してこれを達成する必要があります。

答えて

9

あなたは、トップ5の値を見つけるためにrow_numberを使用し、where節でそれらをフィルタリングすることができます

select avg(col1) 
from (
     select row_number() over (order by col1 desc) as rn 
     ,  * 
     from YourTable 
     ) as SubQueryAlias 
where rn > 5 
+0

(NVLがある場合null値を省略するために行われている/列column_name内の任意です)私のデータセットから上/下の5行を削除します。 MAX()の上位5つの値を削除する必要があります。つまり、私のデータセットに(111,123,1231,15151,12311,1,1,1,2,1,1 ....)が含まれている場合、1桁の結果を返すAVG()を実行したい。 –

+3

@Arkadi:彼の質問はそれを行います。 'order by'に注意してください。 –

+0

Hmm。私が欠けているように見えるのは、overキーワードが正確にしていることです。それは非常に関連性が高いように結果を分割することに関連することを除いて、迅速なGoogleは多くを返しません。私はそれを試してみよう。 –

-1

まず、取得MAX 5値:

SELECT TOP 5 RowId FROM Table ORDER BY Column 

は今すぐにこれを使用しますあなたの主なステートメント:

SELECT AVG(Column) FROM Table WHERE RowId NOT IN (SELECT TOP 5 RowId FROM Table ORDER BY Column) 
+5

'TOP'はOracleでは利用できません –

+0

Oracleでは、' TOP'は 'LIMIT'に置き換えられました。 –

+4

OracleにTOPまたはLIMITがありません –

0

これを行う最も効率的な方法は、 (sum(all values) - sum(top 5 values))/(row_count - 5)

SELECT SUM(val) AS top5sum FROM table ORDER BY val DESC LIMIT 5 

SELECT SUM(val) AS allsum FROM table 

SELECT (COUNT(*) - 5) AS bottomCount FROM table 

は平均が(allsum - top5sum)/bottomCount

+3

Oracleでは 'LIMIT'は使用できません –

2
select column_name1 from 
(
    select column_name1 from table_name order by nvl(column_name,0) desc 
)a 
where rownum<6 

その後、私はする必要はありません