Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ultimo seis registros (https://www.clubdelphi.com/foros/showthread.php?t=66022)

sierraja 28-01-2010 02:25:53

Ultimo seis registros
 
Saludos a todos.

Tengo la siguiente tabla con dos columnas y cinco registros:

columna1,columna2

ana,10
maria,15
jose, 11
jesus, 20
martin,30



Necesito sacar el promedio de los tres ultimos registros. Cual seria la instruccion en sql en firebird. Gracias por su atencikon...

guillotmarc 28-01-2010 09:33:01

Algo como esto funcionaría

select sum(columna2) / 3
from tabla
where id in (select first 3 id from tabla order by id descending)

Como puedes ver he añadido una columna más, la columna 'id' para especificar la clave primaria. Con esa clave primaria puedes ordenar descendentemente para obtener los 3 últimos registros.

Saludos.

Ricardojosep 28-01-2010 15:27:25

Hola sierraja, también puedes hacer algo como esto...

Código SQL [-]
select avg(col2) from (select col2 from tabla rows 3);

Lo de guillotmarc es una muy buena solución, no conocía el select first...

Saludos!!

Caro 28-01-2010 16:24:25

Hola sierraja, sería bueno que tuvieras un campo al puedas ordenarlo de forma desencente como el id que te indica guillotmarc y obtener con first o rows la cantidad de registros que quieres y aplicarle AVG para el promedio, pero si solo tienes los dos campos que nos muestras lo que se me ocurre es que primero hagas una consulta para obtener la cantidad de registros de tu tabla, restarle la cantidad de los registros que quieres y utilizar skip en tu siguiente consulta.

Código Delphi [-]
Query.Text := 'Select count(*) as Total From Tabla';
 
Cantidad := Query.FieldByName('Total').AsInteger - 6;
 
Query.Text := 'Select AVG(columna2) '+
                    'From (Select skip '+Cantidad+' * From tabla)';

Saluditos

guillotmarc 28-01-2010 17:40:17

Cita:

Empezado por Ricardojosep (Mensaje 352115)
Hola sierraja, también puedes hacer algo como esto...

Código SQL [-]select avg(col2) from (select col2 from tabla rows 3);


Lo de guillotmarc es una muy buena solución, no conocía el select first...

Saludos!!

Algo parecido a esto fue lo primero que me vino a la cabeza. Pero estas consultas derivadas (creo que se llaman), es decir hacer un select sobre un select en lugar de sobre una tabla, solo funciona a partir de Firebird 2.1. Y @sierraja no nos ha dicho con qué versión de Firebird trabaja.

Respecto al FIRST, es lo mismo que el ROWS, solo que se pone a continuación de SELECT y no al final de la consulta. De nuevo he utilizado el FIRST, porqué este funciona en todas las versiones de Firebird, mientras que el ROWS solo funciona en Firebird 2.0 para arriba.

Finalmente, fijate @ricardojosep que @sierraja nos ha pedido los últimos tres registros, pero tu consulta hace la media de los tres primeros (y ya es mucho suponer que sean los tres primeros, puesto que si no le marcamos ninguna ordenación, el motor puede escoger el orden y los tres registros que primero le vengan a mano, y técnicamente seguirá siendo igual de correcto).

Para especificar que queremos los tres últimos registros hay que poner forzosamente un order by, es decir, proporcionar un campo sobre el que se pueda especificar quienes van primeros y quienes últimos.

Saludos.

Ricardojosep 28-01-2010 20:38:18

Hola guillotmarc, tiene razon con todo lo que has dicho, realmente me olvide de ordenar la consulta para obtener los ultimos 3 registros.

Siempre se aprende algo nuevo!

Saludos!!!

Ricardo.

sierraja 30-01-2010 15:12:45

Saludos a todos.

Relamente la propuesta de guillotmarc me funciono al pelo y efectivamente los comentarios siguientes van directamente al grano y son aplicables en su totalidad. Pero la situacion fue solucionada con el aporte de guillotmarc. Gracias a todos,son un excelente equipo.


La franja horaria es GMT +2. Ahora son las 21:24:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi