Ajuda com Query: retornar valor mais próximo

2 respostas
K

Olá a todos.

Estou com dificuldades para fazer a seguinte query:

Tem uma tabela chamada T0501_INDICES, nela uma coluna chamada A0501_TAXAMENSAL nesta coluna há diversos números do tipo FLOAT como por exemplo:

A0501_ID | A0501_TAXAMENSAL
1 | 1.03
2 | 1.50
3 | 2.35
4 | 2.40
5 | 3.60

Baseado em um valor X que o usuário digitar a query teria que retornar o valor mais próximo tanto para mais como para menos, supondo que ele digite 2.37 a query retornaria a linha do número 2.35 (ID 3). Caso digitasse 1.40 retornaria 1.50 (ID 2)

Obrigado.

2 Respostas

C

Cara, vc trabalha com que banco?
É Oracle?
Se for, essa query aqui resolve o problema:

select nvl(
		(select maiorValor.valor from dual where (maiorValor.valor - ?) < (? - menorValor.valor))
		, menorValor.valor) from 
(select min(A0501_TAXAMENSAL) as valor from T0501_INDICES where A0501_TAXAMENSAL > ?) maiorValor,
(select max(A0501_TAXAMENSAL) as valor from T0501_INDICES where A0501_TAXAMENSAL < ?) menorValor

A primeira coisa que ela faz é separar os dois valores mais próximos: o mais próximo superior e o mais próximo inferior
Dai, depois eu computo sobre quem está mais perto.

edit: para corrigir a query, é só vc tratar valores extremos, pois senão, a query vai retornar null para valores além do valor máximo e mínimo

K

Agradeço sua ajuda.

Estou utilizando o firebird, tentei refazer a query que você passou substituindo os comandos para se enquadrar no firebird, porém parece que o firebird não aceita subtração/adição.

Bolei uma query que faz quase o que eu quero, o resultando então eu manipulo.

SELECT
      A0501_ID,
      A0501_TAXAMENSAL
FROM
    T0501_INDICES
WHERE
     (SELECT
         MAX(A0501_TAXAMENSAL)
     FROM
         T0501_INDICES
     WHERE
         A0501_TAXAMENSAL < ?) = A0501_TAXAMENSAL

     OR

     (SELECT
         MIN(A0501_TAXAMENSAL)
     FROM
         T0501_INDICES
     WHERE
         A0501_TAXAMENSAL > ?) = A0501_TAXAMENSAL
Criado 17 de setembro de 2009
Ultima resposta 23 de set. de 2009
Respostas 2
Participantes 2