Optimizar consulta que busca el maximo MAX

Optimizar consulta que busca el maximo MAX

Buen día mi objetivo es obtener la máxima nota de cada estudiante, sabiendo que pudo ver un curso mas de una vez.

Esta consulta es parte de una migración SQL SERVER 2000 a POSTGRESQL, en el DBMS anterior tarda pero arroja resultados, en POSTGRESQL se tarda tanto que aún no he logrado verlos cuando decido cancelar y buscar opciones por el exceso de tiempo consumido:

SELECT
id,
codcurso,
estudiante,
nota_real AS nota_max
FROM

tbl_cursos_recibidos_notas AS T1

WHERE

(nota_num =

(SELECT MAX(nota_num)

FROM

tbl_cursos_recibidos_notas AS T2

WHERE

T1.estudiante= T2.estudiante
AND
T1.codcurso = T2.codcurso
)
)

¿Alguna recomendación? Soy nuevo con postgresql y quizás pueda tener algún error de sintaxis que no logro ver.

Agradezco de antemano la ayuda, pues carezco de colegas cercanos donde consultar.

Saludos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de rafaelma

Re: Optimizar consulta que busca el maximo MAX

Necesitamos más información. Nos puedes mandar el resultado de estos comandos desde el cliente psql:

  • \d tbl_cursos_recibidos_notas
  • EXPLAIN consulta_SQL_con_problemas

--
Rafael Martinez
Webmaster

datos de tabla y explain (limit 10)

******************************************************************
\d tbl_cursos_recibidos_notas:
******************************************************************
Table "public.tbl_cursos_recibidos_notas"
Column | Type | Modifiers
------------+-----------------------+-----------
id | character varying(10) |
codcurso | character varying(8) | not null
estudiante | bigint | not null
nota_real | character varying(5) |
nota_num | real |

******************************************************************
EXPLAIN consulta_SQL_con_problemas (LIMIT 10 pues no termina nunca de ejecutar si se hace con todos los registros):
******************************************************************

"Limit (cost=0.00..35860326.40 rows=10 width=22) (actual time=696.596..7689.607 rows=10 loops=1)"
" -> Seq Scan on tbl_cursos_recibidos_notas t1 (cost=0.00..14451711538.15 rows=4030 width=22) (actual time=696.592..7689.579 rows=10 loops=1)"
" Filter: (nota_num = (subplan))"
" SubPlan"
" -> Aggregate (cost=17928.27..17928.28 rows=1 width=4) (actual time=699.028..699.029 rows=1 loops=11)"
" -> Seq Scan on tbl_cursos_recibidos_notas t2 (cost=0.00..17928.26 rows=1 width=4) (actual time=0.017..698.995 rows=4 loops=11)"
" Filter: (($0 = trabajador) AND (($1)::text = (codcurso)::text))"
"Total runtime: 7689.704 ms"

******************************************************************
NOTA: esta tabla (public.tbl_cursos_recibidos_notas) tiene 806192 registros.

Imagen de rafaelma

Re: datos de tabla y explain (limit 10)

¿Has escrito todos los datos que te da \d tbl_cursos_recibidos_notas? ¿No te da ninguna informacion sobre indices, etc al final?

--
Rafael Martinez
Webmaster

agrupe x estudiante en el max

agrupe x estudiante en el max para no comparar de nuevo contra la misma tabla

CREO QUE ASI TE PODRIA FUNCIONAR.

SELECT MAX(id), codcurso, estudiante, MAX(nota_num) AS nota_max FROM
tbl_cursos_recibidos_notas AS T1
GROUP BY codcurso, estudiante

Enviar nuevo comentario

  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><h2><pre>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato

Image CAPTCHA
Enter the characters shown in the image.