Ir al contenido


Foto

[RESUELTO] Obtener las fechas del primer y úlitmo registro en una consulta


  • Por favor identifícate para responder
31 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 06:11

Pues eso, como dice el título, ¿cómo obtengo la fecha del primer y último registro desde una consulta?, obvio que existe un campo Fecha del tipo DATE :D. Utilizo Firebird 2.1

Saludos.
  • 0

#2 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

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.
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 06:43

Ah joder, pues es simple, pero intenté hacerlo con UNION, ¿Firebird no lo acepta?.
  • 0

#4 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 11 marzo 2010 - 06:46

Depende de la sintaxis que quieras usar..., SE SUPONE que Firebird incorpora ANSI92 en SQL, pero a veces como que la implementación de algunas sentencias es casi exclusiva o tiene errores...
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 06:48

Pues fíjate que quise hacerlo así:



sql
  1. SELECT (LOG_FECHA) AS PRIMERO FROM LOG_ASISTENCIA ORDER BY LOG_FECHA ASC
  2. UNION
  3. 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.
  • 0

#6 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 11 marzo 2010 - 06:51

A menos que me equivoque, UNION, JOIN, y todas las sentencias que unen tablas de datos, requieren que se trabaje sobre tablas diferentes..., y tú quieres hacerlo sobre la misma tabla.

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.
  • 0

#7 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 11 marzo 2010 - 06:59

Hola
Facilmente, asi:


sql
  1. SELECT FIRST (TuTabla.[Fecha]) AS FechaPrin, LAST (TuTabla.[Fecha]) AS FechaFin
  2. FROM TuTabla


Saludos
  • 0

#8 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 11 marzo 2010 - 07:12

Hola
Creo que firebird no acepta los corchetes.
En Access esta consulta da exactamente lo que buscas.
Saludos
  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 07:17

Hola
Facilmente, asi:


sql
  1. SELECT FIRST (TuTabla.[Fecha]) AS FechaPrin, LAST (TuTabla.[Fecha]) AS FechaFin
  2. FROM TuTabla


Saludos


Nop, la función First en Firebird se usa de la siguiente manera:



sql
  1. SELECT FIRST 10 SKIP 20 FECHA FROM TABLA



Y la función LAST no existe en Firebird.
  • 0

#10 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 11 marzo 2010 - 07:18

Hola
Amo a Access jejeje.
Saludos
  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 07:38

Pues lo que he hecho es lo siguiente:



sql
  1. SELECT (SELECT LOG_FECHA FROM LOG_ASISTENCIA ORDER BY LOG_FECHA ASC) AS PRIMERO,
  2.       (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:



delphi
  1. procedure TFAstGen.FormShow(Sender: TObject);
  2. var Primero, Ultimo: string;
  3. begin
  4. //Obtenemos el primer registro
  5. QGetLogs.Close;
  6. QGetLogs.SQL.Clear;
  7. QGetLogs.SQL.Text := 'SELECT LOG_FECHA FROM LOG_ASISTENCIA';
  8. QGetLogs.Open;
  9. QGetLogs.First;
  10.  
  11. Primero := QGetLogs.Fields[0].AsString;
  12.  
  13. //Obtenemos el último registro
  14. QGetLogs.Close;
  15. QGetLogs.SQL.Clear;
  16. QGetLogs.SQL.Text := 'SELECT LOG_FECHA FROM LOG_ASISTENCIA';
  17. QGetLogs.Open;
  18. QGetLogs.Last;
  19.  
  20. Ultimo := QGetLogs.Fields[0].AsString;
  21.  
  22. lbl1.Caption := 'Generarán datos desde ' + Primero + ' Hasta ' + Ultimo;
  23. end;


  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 marzo 2010 - 07:41

Una pregunta amigo, ¿que es lo que buscas un resultado como esto?


+----------+----------+-----+----------+
| 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,
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 07:44

Pues el segundo caso :D.
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 marzo 2010 - 08:02

¡Lo logré! :D, pero no me convence esta forma de hacerlo. Debes hacer algo como:



sql
  1. SELECT FIRST 1 (SELECT FIRST 1 FECHA FROM TABLA1 ORDER BY 1 ASC),
  2. (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,
  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 08:07

Wow, excelente amigo, funciona de pelos :D (y) ¡Gracias!
  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 marzo 2010 - 08:13

Con un índice para el campo de tipo ascending creo que mejora un poco la cosa:

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é :p.

Estoy probando contra una tabla con 1000 registros y la cosa es instantánea. Con más registros... no se.

Saludos,
  • 0

#17 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 08:43

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.
  • 0

#18 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

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,
  • 0

#19 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 08:52

Saludos.

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.
  • 0

#20 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 11 marzo 2010 - 09:57



delphi
  1.     select * from(Select first 1 fechan from central order by fechan desc) union all
  2. 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.

  • 0




IP.Board spam blocked by CleanTalk.