Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-11-2004
Ignacio Ignacio is offline
Miembro
 
Registrado: may 2003
Posts: 77
Poder: 21
Ignacio Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 12-11-2004
quetzal quetzal is offline
Miembro
 
Registrado: may 2003
Posts: 78
Poder: 21
quetzal Va por buen camino
oeder by NumeroCOT
__________________
Toda Teoria es Gris mas es verde en Arbol de Dorados Frutos que es la Vida (Goethe)
Responder Con Cita
  #3  
Antiguo 12-11-2004
Ignacio Ignacio is offline
Miembro
 
Registrado: may 2003
Posts: 77
Poder: 21
Ignacio Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 12-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿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
Responder Con Cita
  #5  
Antiguo 13-11-2004
Ignacio Ignacio is offline
Miembro
 
Registrado: may 2003
Posts: 77
Poder: 21
Ignacio Va por buen camino
Ante utilizaba Paradox ahora InterBase.
¿Como es eso de limitar los registros resultantes?
Responder Con Cita
  #6  
Antiguo 13-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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 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

Última edición por roman fecha: 13-11-2004 a las 01:16:08.
Responder Con Cita
  #7  
Antiguo 14-11-2004
Ignacio Ignacio is offline
Miembro
 
Registrado: may 2003
Posts: 77
Poder: 21
Ignacio Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 21:28:00.


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