top only first 11g sql oracle top-n

sql - only - Oracle SELECT TOP 10 discos



select top oracle (6)

Tengo un gran problema con una declaración SQL en Oracle. Quiero seleccionar los 10 registros principales ordenados por STORAGE_DB que no están en una lista de otra declaración de selección.

Este funciona bien para todos los registros:

SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') = ''06.02.2009'')

Pero cuando estoy agregando

AND ROWNUM <= 10 ORDER BY STORAGE_GB DESC

Obtengo algún tipo de Registros "aleatorios". Creo que porque el límite toma lugar antes de la orden.

¿Alguien tiene una buena solución? El otro problema: esta consulta es realmente lenta (10k + registros)


Con respecto a los malos resultados, hay muchas cosas que podrían ser, y realmente debería ser una pregunta aparte. Sin embargo, hay una cosa obvia que podría ser un problema:

WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') = ''06.02.2009'')

Si HISTORY_DATE realmente es una columna de fecha y si tiene un índice, esta reescritura tendrá un mejor rendimiento:

WHERE HISTORY_DATE = TO_DATE (''06.02.2009'', ''DD.MM.YYYY'')

Esto se debe a que una conversión de tipo de datos deshabilita el uso de un índice B-Tree.


Deberá colocar su consulta actual en una subconsulta de la siguiente manera:

SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') =''06.02.2009'') ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10

Oracle aplica rownum al resultado una vez que ha sido devuelto.
Debe filtrar el resultado después de que se haya devuelto, por lo que se requiere una subconsulta. También puede usar la función RANK() para obtener resultados Top-N.

Para el rendimiento intente usar NOT EXISTS en lugar de NOT IN . Vea this para más.


Obtiene un conjunto aparentemente aleatorio porque ROWNUM se aplica antes de ORDER BY. Por lo tanto, su consulta toma las primeras diez filas y las ordena.0 Para seleccionar los diez salarios principales, debe usar una función analítica en una subconsulta y luego filtrar eso:

select * from (select empno, ename, sal, row_number() over(order by sal desc nulls last) rnm from emp) where rnm<=10


Puedes simplemente usar TOP Clause

SELECCIONAR TOP 10 * FROM TABLE;

O

SELECCIONE column_name (s) FROM table_name WHERE ROWNUM <= number;


Si está utilizando Oracle 12c, puede usar:

buscar las siguientes N filas solamente

SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') =''06.02.2009'') ORDER BY STORAGE_GB DESC FETCH NEXT 10 ROWS ONLY

Más información: http://docs.oracle.com/javadb/10.5.3.0/ref/rrefsqljoffsetfetch.html


intente SELECCIONAR * DE los usuarios FETCH NEXT 10 ROWS ONLY;