Как взять ближайшее число в столбце в Oracle Select - PullRequest
2 голосов
/ 14 декабря 2009

У меня есть таблица адресов, и мне нужно взять ближайший номер. Например, если я введу число 256 в этом случае, я возьму 257, потому что 254 <- 256-> 257

Кто-то знает решение.

Спасибо и извините за мой плохой английский.

Ответы [ 4 ]

3 голосов
/ 14 декабря 2009

Расстояние между 257 и числом abs(number-257). Таким образом, вы можете найти (один из) ближайших номеров с:

select number
from (
    select number
    from yourtable
    order by abs(number-257)
) sub
where rownum < 2
2 голосов
/ 14 декабря 2009
SELECT  *
FROM    mytable
WHERE   mynumber BETWEEEN 256 - 2 AND 256 + 2

Если вам просто нужно выбрать первый матч, используйте это:

SELECT  *
FROM    (
        SELECT  *
        FROM    (
                SELECT  *
                FROM    (
                        SELECT  *
                        FROM    mytable
                        WHERE   mynumber <= 256
                        ORDER BY
                                mynumber DESC
                        )
                WHERE   rownum = 1
                UNION ALL
                SELECT  *
                FROM    (
                        SELECT  *
                        FROM    mytable
                        WHERE   mynumber > 256
                        ORDER BY
                                mynumber
                        )
                WHERE   rownum = 1
                )
        ORDER BY
                ABS(256 - number), mynumber DESC
        )
WHERE   rownum = 1

Это более эффективный индекс, так как конечный ORDER BY будет сортировать не более двух записей.

0 голосов
/ 19 декабря 2009

Попробуйте это

Num integer := 236;

 select Max(number) AS NearestAndGreatest  from mytbl t
 join(
 select MIN(T.distance) AS dist from(
 select number,abs(number-Num) AS distance from mytbl)T)X
 on abs(number-Num) = X.dist
0 голосов
/ 18 декабря 2009

Я пробовал sql другим способом, но на основе SQL Quassnoi. Я сделал несколько изменений, и это работает хорошо. Посмотрите:

(SELECT * FROM 
  (SELECT number 
    FROM numberList 
    WHERE number < ? 
    ORDER BY number DESC) 
    WHERE ROWNUM=1) 
    UNION ALL 
    (SELECT * FROM 
    (SELECT number  
    FROM numberList 
    WHERE numeber > ? 
    ORDER BY number ASC) 
    WHERE ROWNUM=1) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...