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)
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
Klavros
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