Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-01-2010
Avatar de sierraja
sierraja sierraja is offline
Miembro
 
Registrado: sep 2004
Posts: 281
Poder: 20
sierraja Va por buen camino
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...
Responder Con Cita
  #2  
Antiguo 28-01-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 28-01-2010
Ricardojosep Ricardojosep is offline
Miembro
 
Registrado: sep 2003
Ubicación: Sgo del estero (Argentina)
Posts: 75
Poder: 21
Ricardojosep Va por buen camino
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!!
__________________
La amistad es la union de dos almas para formar una sola.
Responder Con Cita
  #4  
Antiguo 28-01-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #5  
Antiguo 28-01-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Cita:
Empezado por Ricardojosep Ver Mensaje
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.

Última edición por guillotmarc fecha: 28-01-2010 a las 17:44:29.
Responder Con Cita
  #6  
Antiguo 28-01-2010
Ricardojosep Ricardojosep is offline
Miembro
 
Registrado: sep 2003
Ubicación: Sgo del estero (Argentina)
Posts: 75
Poder: 21
Ricardojosep Va por buen camino
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.
__________________
La amistad es la union de dos almas para formar una sola.
Responder Con Cita
  #7  
Antiguo 30-01-2010
Avatar de sierraja
sierraja sierraja is offline
Miembro
 
Registrado: sep 2004
Posts: 281
Poder: 20
sierraja Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Microsoft paga seis mil millones de dólares por una empresa modesta semptrion Noticias 5 27-05-2007 16:37:56
Arreglo de Registros, con arreglos de Registros(Dinamico) PiornoCKA&G Varios 4 05-01-2007 08:53:30
por que duplicidad de registros con clientdataset sin ingresar registros ...mysql Arturo MySQL 3 05-09-2006 18:39:37
Seis Mil Casimiro Notevi La Taberna 17 18-07-2006 23:05:57
Como eliminar los registros de hace seis horas salvica SQL 4 23-08-2004 19:02:44


La franja horaria es GMT +2. Ahora son las 19:40:56.


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
Copyright 1996-2007 Club Delphi