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.

Preguntas similare

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.



Respuesta Responder a este mensaje
#2 GenioMaestro
24/04/2006 - 23:34 | Informe spam
No estoy seguro de lo que hace exactamente tu consulta.

Según veo, para un valor, me da aquellos registros que tengan solo 2 cierres
anteriores menores o iguales al actual.

Si es eso, no se parece a lo que necesito.

Necesito, para cada fecha de cada valor, el segundo mayor cierre de los 110
anteriores.

La estructura de la tabla y sus indices los puedo poner en un mensajem pero
los datos minimos para un valor son 228 k'as, demasiado para un menaje, y no
se si se pueden enviar ficheros comprimidos, que serian sólo 12 k'as

Que hay de mi segundo tema???

Saludos.


"Alejandro Mesa" escribió en el
mensaje news:
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.



Respuesta Responder a este mensaje
#3 Alejandro Mesa
25/04/2006 - 14:47 | Informe spam
GenioMaestro,

No creo poder ayudarte si no posteas la estructura de las tablas que usas,
incluyendo indices, asi como la sentencia que provoca que sql server use 100%
del tiempo del procesador.


AMB

"GenioMaestro" wrote:

No estoy seguro de lo que hace exactamente tu consulta.

Según veo, para un valor, me da aquellos registros que tengan solo 2 cierres
anteriores menores o iguales al actual.

Si es eso, no se parece a lo que necesito.

Necesito, para cada fecha de cada valor, el segundo mayor cierre de los 110
anteriores.

La estructura de la tabla y sus indices los puedo poner en un mensajem pero
los datos minimos para un valor son 228 k'as, demasiado para un menaje, y no
se si se pueden enviar ficheros comprimidos, que serian sólo 12 k'as

Que hay de mi segundo tema???

Saludos.


"Alejandro Mesa" escribió en el
mensaje news:
> 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.
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida