Consulta compleja emulando K.ESIMO.MAYOR de excel

23/04/2006 - 22:44 por GenioMaestro | Informe spam
Hola a todos:

Estoy transformando un programa, si se puede llamar así, hecho en excel,
donde usan una función llamada K.ESIMO.MAYOR que según veo no existe en SQL.

Necesito el segundo máximo valor de una consulta, para lo cual estoy
haciendo algo así como ...

select top 1 cierre
from (SELECT TOP 2 cierre
FROM ( SELECT
TOP 110 CIERRE

FROM COTIZACIONES

WHERE COD_VALOR = @PASA_VALOR AND FECHA < @PASA_FECHA

ORDER BY FECHA DESC)
AS XX_TEMPO
ORDER BY CIERRE DESC )
as xx_tempo2 order by cierre asc

Hago la consulta, selecciono 2 cierres en DESC y lugo selecciono 1 cierre en
ASC, lo que me da exactamente lo que necesito, el segundo máximo.

Esto me obliga a realizar tres consultas para cada frecha de cada valor, lo
que se convierte en una tarea pesada.

Probé con cursores, pero es más lento, solo la creación del cursor consume
más tiempo que la ejecucion de la consulta.

Alguien conoce alguna función de SQL que sea equivalente al K.ESIMO.MAYOR de
excel????

Alguna sugerencia para optimizar esta consulta????


Segundo tema:

Cuando pongo a procesar el programa pasandole códigos de valor y fechas uno
tras otro, el sevidor sql solo usa entre el el 51% y el 58% del procesador
sin que la luz de disco duro parpadee, ya que lo mete todo en memoria. Sin
embargo en otras consultas usa el 100%

Alguien sabe por qué????

Alguna forma de solucionarlo????

Gracias a todos.
 

Leer las respuestas

#1 Alejandro Mesa
24/04/2006 - 14:42 | Informe spam
GenioMaestro,

Ve si esto te sirve.

select *
from dbo.cierre as a
where (
select count(*)
from dbo.cierre as b
where b.cod_valor = a.cod_valor and b.fecha < a.fecha and b.cierre <= a.cierre
) = 2
go

En el caso de que puedan haber valores de "cierre" que sean iguales,
entonces necesitaremos otra columna por la cual romper el empate.

Para solucionar este tipo de problemas, es muy util que se postee la
estructura de la tabla, incluyendo indices, asi como data de ejemplo y
resultado esperado.


AMB


"GenioMaestro" wrote:

Hola a todos:

Estoy transformando un programa, si se puede llamar así, hecho en excel,
donde usan una función llamada K.ESIMO.MAYOR que según veo no existe en SQL.

Necesito el segundo máximo valor de una consulta, para lo cual estoy
haciendo algo así como ...

select top 1 cierre
from (SELECT TOP 2 cierre
FROM ( SELECT
TOP 110 CIERRE

FROM COTIZACIONES

WHERE COD_VALOR = @PASA_VALOR AND FECHA < @PASA_FECHA

ORDER BY FECHA DESC)
AS XX_TEMPO
ORDER BY CIERRE DESC )
as xx_tempo2 order by cierre asc

Hago la consulta, selecciono 2 cierres en DESC y lugo selecciono 1 cierre en
ASC, lo que me da exactamente lo que necesito, el segundo máximo.

Esto me obliga a realizar tres consultas para cada frecha de cada valor, lo
que se convierte en una tarea pesada.

Probé con cursores, pero es más lento, solo la creación del cursor consume
más tiempo que la ejecucion de la consulta.

Alguien conoce alguna función de SQL que sea equivalente al K.ESIMO.MAYOR de
excel????

Alguna sugerencia para optimizar esta consulta????


Segundo tema:

Cuando pongo a procesar el programa pasandole códigos de valor y fechas uno
tras otro, el sevidor sql solo usa entre el el 51% y el 58% del procesador
sin que la luz de disco duro parpadee, ya que lo mete todo en memoria. Sin
embargo en otras consultas usa el 100%

Alguien sabe por qué????

Alguna forma de solucionarlo????

Gracias a todos.



Preguntas similares