Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   A fechas iguales tomar el registro mayor (https://www.clubdelphi.com/foros/showthread.php?t=16048)

Ignacio 12-11-2004 21:20:10

A fechas iguales tomar el registro mayor
 
Hola a todos

Tengo una tabla llamada Cotizaciones y sus campos son "NumeroCOT" y "FechaCOT".
Debo obtener el numero de la fecha igual o inmediatamente menor que la transferida en un parámetro. Si hubiera dos fechas de igual valor que cumplan con la condición, debo tomar en NumeroCOT mayor.

Si el código SQL es:
Código:

Select Max(FechaCOT)
From Cotizaciones
Where FechaCOT=<:FechaMovimiento

Obtengo la fechaCOT pero yo necesito en NumeroCOT de esa fecha.

Si el código SQL es:
Código:

Select NumeroCOT
From Cotizaciones
Where FechaCOT=<:FechaMovimiento

Obtengo todos los registros que cumplan la condición y yo quiero un solo registro.

Aprovecho esta pregunta para consultarles si hiciera esto en procedimientos almacenados ganaria en velocidad o seria indistinto.

Gracias desde ya.

quetzal 12-11-2004 21:22:24

oeder by NumeroCOT

Ignacio 12-11-2004 22:31:12

En el segundo de los casos usaría el order by NumeroCOT, y luego usando MiQuery.Last, me pararía en el registro deseado. Es como lo vengo haciendo hasta ahora. Pero me parece que no es lo óptimo ya que dia a dia la tabla Cotizaciones va creciendo y de este modo la estoy trayendo entera a la memoria por un solo registro que preciso.

Gracias igualmente.

roman 12-11-2004 22:52:22

¿En qué base trabajas? En algunas bases puedes limitar los registros que regresa la consulta de manera que podría funcionarte lo del order by.

Si no, quizá te sirva así:

Código SQL [-]
select max(NumeroCOT)
from cotizaciones
where FechaCOT = (
  select max(FechaCOT) from cotizaciones
  where FechaCOT <= :FechaMovimiento
)

// Saludos

Ignacio 13-11-2004 00:19:36

Ante utilizaba Paradox ahora InterBase.
¿Como es eso de limitar los registros resultantes?

roman 13-11-2004 01:13:44

Cita:

Empezado por Ignacio
¿Como es eso de limitar los registros resultantes?

¿No te funcionó la consulta que te puse? Me extraña porque a mi me funcionó en Paradox y me resultaría asombroso que Paradox pudiera hacer algo que Interbase no.

En algunos motores de bases de datos existen modificadores de la cláusula SELECT para que el servidor sólo devuelva un número determinado de registros. Por ejemplo, en MySql la consulta

Código SQL [-]
select campos from tabla limit 10

te devolverá únicamente los primeros diez registros.

Yo no conozco Interbase :o pero quienes saben dicen esto:

http://www.clubdelphi.com/foros/show...itar+registros

Por otra parte, a diferencia de las bases de datos de buró, como Paradox- que manda todos los registros resultantes al cliente -muchos servidores mandan los resultados "sobre pedido" (o pueden ser configurados para que así lo hagan), esto es, mandan sólo unos cuantos registros del resultado al cliente y conforme éste va pidiendo más, el servidor le manda los siguientes. Es por ello que muchas veces, aunque los datos comienzan a aparecer de inmediato, instrucciones como DataSet.Last demoran una eternidad porque se obliga al servidor a mandar todos los datos.

Pero fíjate que en tu caso puedes ordenar los resultados en forma descendente:

Código SQL [-]
select FechaCot, NumeroCot
from Cotizaciones
where FechaCot <= :FechaMovimiento 
order by FechaCot desc, NumeroCot desc

El primer registro de esta consulta- que no el último -es el registro que buscas, de manera que no teniendo que usar Last, me parece que en realidad no estás trayendo todos los registros por lo que no importaría cuánto crece la tabla.

De cualquier forma a mi me gusta más la primera consulta que te puse ya que no requiere de procedimientos almacenados y sólo pide lo que quieres.

// Saludos

Ignacio 14-11-2004 00:46:30

Roman

Muchísimas gracias y disculpá la demora de mi respuesta.

Me funcionó el primer caso tanto en paradox como en InterBase. Solo te preguntaba por el limitante para saber, porque no sabía que existia.

Bueno. Hasta la próxima.


La franja horaria es GMT +2. Ahora son las 21:57:42.

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