[RESUELTO] Obtener las fechas del primer y úlitmo registro en una consulta
#1
Escrito 11 marzo 2010 - 06:11
Saludos.
#2
Escrito 11 marzo 2010 - 06:29
...obvio que existe un campo Fecha del tipo DATE...
SELECT * FROM TuTabla ORDER BY TuFecha;
Cuando tengas todo ordenado, TuTabla.First y TuTabla.Last...
Rápido y efectivo..., "sucio", pero efectivo.
#3
Escrito 11 marzo 2010 - 06:43
#4
Escrito 11 marzo 2010 - 06:46
#5
Escrito 11 marzo 2010 - 06:48
SELECT (LOG_FECHA) AS PRIMERO FROM LOG_ASISTENCIA ORDER BY LOG_FECHA ASC UNION SELECT (LOG_FECHA) AS ULTIMO FROM LOG_ASISTENCIA ORDER BY LOG_FECHA DESC
y me da error en UNION, incluso usé UNION ALL e igual me da error.
#6
Escrito 11 marzo 2010 - 06:51
Y aclaro, PODRÍA ESTAR EQUIVOCADO, tiene bastante tiempo que no hago SQL muy complejo, así que la sintaxis no la tengo muy fresca para éstas sentencias.
#7
Escrito 11 marzo 2010 - 06:59
Facilmente, asi:
SELECT FIRST (TuTabla.[Fecha]) AS FechaPrin, LAST (TuTabla.[Fecha]) AS FechaFin FROM TuTabla
Saludos
#8
Escrito 11 marzo 2010 - 07:12
Creo que firebird no acepta los corchetes.
En Access esta consulta da exactamente lo que buscas.
Saludos
#9
Escrito 11 marzo 2010 - 07:17
Hola
Facilmente, asi:
sql
SELECT FIRST (TuTabla.[Fecha]) AS FechaPrin, LAST (TuTabla.[Fecha]) AS FechaFin FROM TuTabla
Saludos
Nop, la función First en Firebird se usa de la siguiente manera:
SELECT FIRST 10 SKIP 20 FECHA FROM TABLA
Y la función LAST no existe en Firebird.
#10
Escrito 11 marzo 2010 - 07:18
Amo a Access jejeje.
Saludos
#11
Escrito 11 marzo 2010 - 07:38
SELECT (SELECT LOG_FECHA FROM LOG_ASISTENCIA ORDER BY LOG_FECHA ASC) AS PRIMERO, (SELECT LOG_FECHA FROM LOG_ASISTENCIA ORDER BY LOG_FECHA DESC) AS ULTIMO FROM LOG_ASISTENCIA
y me da un error en mi IBExpert de "Multiple rows on an singleton" algo así .
Pero mientras tengo esta chapuza que funciona, pero le encuentro muchas líneas para poca cosa pues:
procedure TFAstGen.FormShow(Sender: TObject); var Primero, Ultimo: string; begin //Obtenemos el primer registro QGetLogs.Close; QGetLogs.SQL.Clear; QGetLogs.SQL.Text := 'SELECT LOG_FECHA FROM LOG_ASISTENCIA'; QGetLogs.Open; QGetLogs.First; Primero := QGetLogs.Fields[0].AsString; //Obtenemos el último registro QGetLogs.Close; QGetLogs.SQL.Clear; QGetLogs.SQL.Text := 'SELECT LOG_FECHA FROM LOG_ASISTENCIA'; QGetLogs.Open; QGetLogs.Last; Ultimo := QGetLogs.Fields[0].AsString; lbl1.Caption := 'Generarán datos desde ' + Primero + ' Hasta ' + Ultimo; end;
#12
Escrito 11 marzo 2010 - 07:41
+----------+----------+-----+----------+
| Campo1 | Campo2 | ... | CampoN |
+----------+----------+-----+----------+
| primero1 | primero2 | ... | primeroN |
+--------------------------------------+
| último1 | último2 | ... | últimoN |
+----------+----------+-----+----------+
¿O algo como esto?
+---------+--------+
| Primero | Último |
+---------+--------+
| fecha | fecha |
+---------+--------+
Si es lo primero, ya sea que se trata de uno o varios campos creería que no es posible conseguirlo. El motor debe elegir un índice con el cual trabajar, o lo hace ascendente o descendente. No puede realizar ambas cosas.
Una consulta como la que describes, dará error ya que no puede moverse en ambas direcciones de forma simultánea. Esa es mi explicación.
Firebird si acepta UNION.
Si es lo segundo, suena tentador hacer una especie de select ... Max() y Min() algo parecido a la consulta de Carlos pero como es de esperar, no necesariamente Max() y Min() van a ser el último y el primer registro.
Ha decir verdad amigo no se si habrá manera de realizarlo tan limpiamente con una consulta SQL y UNION... Lo máximo que se me ocurre es que quizá se pueda programar un procedimiento almacenado y que dispare ambas consultas (una para obtener el primero y otra para el obtener el último) por separado y agregue los respectivos registros a una tabla temporal
Saludos,
#13
Escrito 11 marzo 2010 - 07:44
#14
Escrito 11 marzo 2010 - 08:02
SELECT FIRST 1 (SELECT FIRST 1 FECHA FROM TABLA1 ORDER BY 1 ASC), (SELECT FIRST 1 FECHA FROM TABLA1 ORDER BY 1 DESC) FROM TABLA1
Este es el plan que me generó:
Plan
PLAN SORT ((TABLA1 NATURAL))
PLAN SORT ((TABLA1 NATURAL))
PLAN (TABLA1 NATURAL)
Adapted Plan
PLAN SORT ((TABLA1 NATURAL)) PLAN SORT ((TABLA1 NATURAL)) PLAN (TABLA1 NATURAL)
Debo admitir que no tiene un índice en el campo FECHA... lo tengo para el campo ID, de forma ascending.
Recuerda amigo que debes hacer uso de FIRST, de otro modo obtendrás todos ordenados... tu sólo buscas el primer registro del data set devuelto tanto para el ordenamiento descendiente como para el ascendente.
En tus consultas veo que sólo te limitas a ordenarlo.
Saludos,
#15
Escrito 11 marzo 2010 - 08:07
#16
Escrito 11 marzo 2010 - 08:13
Plan
PLAN SORT ((TABLA1 NATURAL))
PLAN (TABLA1 ORDER IDX_FECHA)
PLAN (TABLA1 NATURAL)
Adapted Plan
PLAN SORT ((TABLA1 NATURAL)) PLAN (TABLA1 ORDER IDX_FECHA) PLAN (TABLA1 NATURAL)
Yo mucho sobre el manejo de los planes no entiendo, al menos está utilizando el índice IDX_FECHA que agregué .
Estoy probando contra una tabla con 1000 registros y la cosa es instantánea. Con más registros... no se.
Saludos,
#17
Escrito 11 marzo 2010 - 08:43
Lastima que llegue tarde, la solución de Delphius es la que te hubiese dado; yo en lo particular le agregaría dos indices uno Ascendente y otro Descendente.
#18
Escrito 11 marzo 2010 - 08:49
Saludos.
Lastima que llegue tarde, la solución de Delphius es la que te hubiese dado; yo en lo particular le agregaría dos indices uno Ascendente y otro Descendente.
Eso hice ahorita, y funciona mejor. Este es el Plan que me da:
Plan
PLAN (TABLA1 ORDER IDX_FECHA2)
PLAN (TABLA1 ORDER IDX_FECHA)
PLAN (TABLA1 NATURAL)
Adapted Plan
PLAN (TABLA1 ORDER IDX_FECHA2) PLAN (TABLA1 ORDER IDX_FECHA) PLAN (TABLA1 NATURAL)
sería bueno que no aplicara el NATURAL (de lo poco que entiendo, NATURAL implica que no emplea ningún índice, sin optimización alguna)... debido a la naturaleza de la consulta quizá no pueda evitarse esta "unión" natural entre la primera subconsulta y la segunda.
Saludos,
#19
Escrito 11 marzo 2010 - 08:52
Sí Delphius estas en lo correcto, con NATURAL hace un Full Scan, ya estará en nuestro amigo Enecumene ver su tabla y tratar de optimizar la sentencia.
#20
Escrito 11 marzo 2010 - 09:57
select * from(Select first 1 fechan from central order by fechan desc) union all select first 1 fechan from central
Plan
PLAN SORT ((CENTRAL NATURAL))
PLAN (CENTRAL NATURAL)
Adapted Plan
PLAN SORT ((CENTRAL NATURAL)) PLAN (CENTRAL NATURAL)
Pues a mi me funciona bien asi.