2011-06-26 11 views
5

Quiero poder realizar una media() en una columna después de eliminando los 5 valores más altos en y ver que el stddev no está por encima de un cierto número. Esto tiene que hacerse completamente como una consulta PL/SQL.Busque los 5 mejores valores MAX() de una tabla SQL y luego realice una AVG() en esa tabla sin ellos

EDITAR: Para aclarar, tengo un conjunto de datos que contiene valores en un cierto rango y rastrea la latencia. Quiero saber si el AVG() de esos valores se debe a un aumento general en la latencia, o debido a unos pocos valores con un stddev muy alto. Es decir - (1, 2, 1, 3, 12311) en oposición a (122, 124, 111, 212). También necesito lograr esto a través de una consulta SQL debido a las limitaciones de nuestro software de monitoreo.

Respuesta

9

Puede utilizar row_number para encontrar los 5 mejores valores, y filtrarlos a cabo en un where cláusula:

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

No necesito eliminar las 5 filas superiores/inferiores de mi conjunto de datos. Necesito eliminar los 5 mejores valores MAX(). Es decir, si mi conjunto de datos contiene (111, 123, 1231, 15151, 12311, 1, 1, 1, 2, 1 ....) Quiero realizar un AVG() que devuelva los resultados de los dígitos individuales . –

+3

@Arkadi: su consulta hace eso. Tenga en cuenta el "orden de". –

+0

Hmm. Lo que parece que me falta es lo que hace exactamente la palabra clave sobre. Un google rápido no devuelve mucho, excepto que se trata de particionar los resultados, lo que parece muy relevante. Trataré de investigar eso. –

-1

primer lugar, obtener los MAX 5 valores:

SELECT TOP 5 RowId FROM Table ORDER BY Column 

Ahora utilizar esto en su declaración principal:

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

'TOP' no está disponible en Oracle –

+0

En Oracle,' TOP' se reemplaza por 'LIMIT'. –

+4

Oracle no tiene TOP o LIMIT –

0

Bueno, la manera más eficiente de hacerlo sería calcular (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 

el promedio es entonces (allsum - top5sum)/bottomCount

+3

'LIMIT' no está disponible en Oracle –

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

(NVL se hace para omitir el valor null si hay/son cualquiera en la columna column_name)

Cuestiones relacionadas