Ir al contenido


Foto

Obtener los ultimos 20 registros de una tabla


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

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 17 febrero 2015 - 05:05

Hola!!

Con este consulta:

select first(20) * from datos
order by id desc


Obtengo los ultimos 20 registros de la tabla datos. Hasta ahi no hay problema, el problema viene que los obtengo asi:

40
39
38
37
36
35
.
.
.
23
22
21
20


y necesito que en dbgrid se vean en el orden opuestos es decir primero el 20,21,22...39,40

Alguna sugerencia??

Se agradece su tiempo.  (b)
  • 0

#2 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 17 febrero 2015 - 05:42

Supongo que habrá alguna otra forma. Pero a los efectos de solucionar simplemente el problema sin mirar mucho a la elegancia te digo que podrías utilizar dos consultas, en una trabajas y la otra la utilizas para el dbgrid, lógicamente que en el dbgrid la consulta estará invertida (quitando la palabra "desc").
Al decir en una "trabajas", me refiero a que por alguna razón necesitas que el dbgrid muestre algo que no debe ser así, entonces utilizarías una consulta diferente para hacer lo que debas y la otra para mostrar los resultados.

Quizá experimentando con DataSnap puedas lograrlo.

Saludos
(b)
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 17 febrero 2015 - 05:58



select skip ((select count(*) - 20 from Datos))
  *  from Datos
  order by id  asc



Saludos.
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

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

Escrito 18 febrero 2015 - 05:53

Saludos.

También tienes la posibilidad de usar la clausula ROWS.
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 18 febrero 2015 - 06:07

Hola.

Una solución muy simple sería esta, aplicar un order al resultado de tu select :

select *
from (SELECT FIRST(20) * FROM datos ORDER BY id DESC)
order by id ASC

A partir de Firebird 2 puedes usar un SELECT como origen de tu consulta, en lugar de una tabla que es lo habitual.

Saludos.

  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 18 febrero 2015 - 06:31

Hola.

Una solución muy simple sería esta, aplicar un order al resultado de tu select :

select *
from (SELECT FIRST(20) * FROM datos ORDER BY id DESC)
order by id ASC

A partir de Firebird 2 puedes usar un SELECT como origen de tu consulta, en lugar de una tabla que es lo habitual.

Saludos.


La solución de Marc efectivamente funciona, pero el tiempo de ejecución es 5 veces mayor que la solución que te planteo en la segunda respuesta.

Saludos.
  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 18 febrero 2015 - 08:12

Yo no entiendo la pregunta... el titulo dice que quiere los ULTIMOS 20, pero luego el select toma los PRIMEROS 20 y solo pregunta como cambiar la ordenacion de los datos, no si son primeros o ultimos... ¿cual de los 2 es tu problema?
  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 18 febrero 2015 - 11:00

Yo no entiendo la pregunta... el titulo dice que quiere los ULTIMOS 20, pero luego el select toma los PRIMEROS 20 y solo pregunta como cambiar la ordenacion de los datos, no si son primeros o ultimos... ¿cual de los 2 es tu problema?


Sergio, fíjate que toma los 20 primeros, pero con la ordenación DESCENDING, es decir que en realidad toma los 20 últimos. Pero claro, salen ordenados de mayor a menor (ya que es descending), y lo que quiere es cambiarle la ordenación a ese resultado.

Si hubiera un filtro LAST en lugar de solo el filtro FIRST no necesitaría usar el orden DESCENDING y por tanto ya le saldrían directamente los registros que busca, y en el orden que quiere. Pero como ese filtro no existe, entonces hay que utilizar la solución de Wilson (saltarse n - 20 registros), o la mía (cambiar la ordenación al resultado).
  • 0

#9 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 18 febrero 2015 - 12:53


Yo no entiendo la pregunta... el titulo dice que quiere los ULTIMOS 20, pero luego el select toma los PRIMEROS 20 y solo pregunta como cambiar la ordenacion de los datos, no si son primeros o ultimos... ¿cual de los 2 es tu problema?


Sergio, fíjate que toma los 20 primeros, pero con la ordenación DESCENDING, es decir que en realidad toma los 20 últimos. Pero claro, salen ordenados de mayor a menor (ya que es descending), y lo que quiere es cambiarle la ordenación a ese resultado.

Si hubiera un filtro LAST en lugar de solo el filtro FIRST no necesitaría usar el orden DESCENDING y por tanto ya le saldrían directamente los registros que busca, y en el orden que quiere. Pero como ese filtro no existe, entonces hay que utilizar la solución de Wilson (saltarse n - 20 registros), o la mía (cambiar la ordenación al resultado).


Como siempre en el foro la mejor ayuda, estaba dando vueltas en como explicar esto del FIRST y la no existencia del LAST, excelente explicación. Acabo de tomar la PC asi que voy a probar las respuestas.

Saludos!!
  • 0

#10 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 18 febrero 2015 - 02:17

OK !!

Use la solucion de Wilson. Ahora retorciendo la tuerca quiero aplicar un filtro, algo asi:



delphi
  1. SELECT SKIP ((SELECT COUNT(*) - 20 From Datos))
  2.  * FROM Datos
  3.  WHERE Equipo = 4
  4.  ORDER BY ID DESC



Es decir que ohora quiero los ultimos 20 registros del equipo numero 4. La consulta anterior me regresa toda la tabla. Si la modifico asi:



delphi
  1. SELECT SKIP ((SELECT COUNT(*) - 20 From Datos WHERE Equipo = 4))
  2.  * FROM Datos
  3.  ORDER BY ID DESC



no me regresa nada.

¿Es posible hacer esto?

Como siempre agradezco su ayuda!!


  • 0

#11 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 18 febrero 2015 - 02:28

Aaaahhh... lo había entendido de otra forma.  :p
Como que el despliegue de información era en orden inverso de lo obtenido, es decir ver una cosa distinta de la obtenida.
...Así pos sí.  ;)

A B C D E (Asc.)
E D C B A (Desc.)

Los primeros dos
Desc.: E D
Asc.: A B

Los últimos dos
Desc.: B A
Asc.: D E

Saludos
(b)

  • 0

#12 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 18 febrero 2015 - 03:37


Es decir que ohora quiero los ultimos 20 registros del equipo numero 4.




SELECT SKIP ((SELECT COUNT(*) - 20 From Datos WHERE Equipo = 4))
* FROM Datos WHERE Equipo = 4
ORDER BY ID DESC



Saludos.

PD: Prueba, porque la anterior consulta podría fallar si los registros devueltos son menos de 20, en ese caso podrías usar la consulta de Marc.

select *
from (SELECT FIRST(20) * FROM datos WHERE Equipo = 4 ORDER BY id DESC)
order by id ASC

  • 0

#13 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 18 febrero 2015 - 05:07

La primera forma me regresa los datos del equipo numero 4, sin embargo no los últimos 20 registros, regresa los primeros 20 registros de la tabla de la tabla. Por alguna razon se anula el



delphi
  1. Count(´) - 20


  • 0




IP.Board spam blocked by CleanTalk.