jluzh_feng
2014-12-04 04:21
采纳率: 0%
浏览 6.6k

请问 sql 怎样 查询最接近某一值的3条数据?急急急!!!

请问 sql 怎样 查询最接近某一值的3条数据?求sql语句如1,2,6,9,120,150,160,查询最接近9的3条记录数值,既1,2,6急急急啊!!!!!!!!!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • xuzuning 2014-12-04 04:49

    select * from T a where (select count(*) from T where n<a.n) < 3

    评论
    解决 无用
    打赏 举报
  • 快乐缠绕 2014-12-04 04:58

    给你个思路,将该值与其他的做减法运算,然后排序,取前三条

    评论
    解决 无用
    打赏 举报
  • Kelley_cfy 2014-12-04 05:02

    你把9的前三个和后三个都取出来,然后再用程序处理拿到最接近的三个就行了,效率不会有什么变化的

    评论
    解决 无用
    打赏 举报
  • Kelley_cfy 2014-12-04 05:11

    类似与这样:
    获取比9大的三条
    select top(3) id from table where id > 9 order by id ASC
    获取比9小的三条
    select top(3) id from table where id < 9 order by id DESC

    取出后和9比较找到最接近的(但是如果有 一些=9的就不行了)

    要是有=9的那就需要先:
    select id from table where id = 9
    得到的数目为n
    判断个数n是否大于3,如果大于就不用找了
    否则如果n小于3,则
    获取比9大的3-n条
    select top(3-n) id from table where id > 9 order by id ASC
    获取比9小的3-n条
    select top(3-n) id from table where id < 9 order by id DESC

    ALL

    评论
    解决 无用
    打赏 举报
  • 王三水 2014-12-04 05:14

    1,2,6,9,120,150,160, 这串值是有序的么? 如果是的话

    select top 3 * from table where value<9 order by value desc

    评论
    解决 无用
    打赏 举报
  • Lyndon_xl 2014-12-04 06:11

    这样应该满足你需求:

     SELECT top 3 * FROM Test WHERE ABS(IdB-5) in (
        SELECT top 4 ABS(IdB-5)as c1 FROM Test order by c1) and IdB<>5
    

    其中 IdB 就是记录值的列名

    评论
    解决 无用
    打赏 举报
  • Jay295290466 2014-12-04 07:47

    SELECT * FROM tablename

    WHERE ABS(column-9)=(SELECT MIN(ABS(column-9)) FROM tablename)

    评论
    解决 无用
    打赏 举报
  • i773254968 2015-12-03 03:40

    SELECT top 3 * FROM Test ORDER BY ABS(IDS - 9)

    评论
    解决 无用
    打赏 举报
  • zhaoya0111 2018-07-19 11:05

    建表:

    /*
    Navicat Premium Data Transfer

    Source Server : 本地数据
    Source Server Type : MySQL
    Source Server Version : 50722
    Source Host : 127.0.0.1:3306
    Source Schema :

    Target Server Type : MySQL
    Target Server Version : 50722
    File Encoding : 65001

    Date: 19/07/2018 19:02:23
    */

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;


    -- Table structure for test_9


    DROP TABLE IF EXISTS test_9;
    CREATE TABLE test_9 (
    id int(11) NOT NULL,
    name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    sex varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    order_id int(11) NULL DEFAULT NULL,
    PRIMARY KEY (id) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;


    -- Records of test_9


    INSERT INTO test_9 VALUES (1, 'fff', 'g', 1);
    INSERT INTO test_9 VALUES (2, 'ffff', 'gff', 2);
    INSERT INTO test_9 VALUES (3, 'fd', 'hb', 5);
    INSERT INTO test_9 VALUES (4, 'rf', 'tg', 6);
    INSERT INTO test_9 VALUES (5, 'er', 'gv', 9);
    INSERT INTO test_9 VALUES (6, 'uj', 'gfd', 12);
    INSERT INTO test_9 VALUES (7, 'tgvf', 'tg', 15);
    INSERT INTO test_9 VALUES (8, 'olk', 'jiu', 16);
    INSERT INTO test_9 VALUES (9, 'lk', 'ik', 34);

    SET FOREIGN_KEY_CHECKS = 1;

    图片说明

    Mysql _ ABS()_ 函数 求绝对值

    #SQL
    SELECT
    ABS( res.order_id - 9 ) x,
    res.*
    FROM
    (
    ( SELECT * FROM test_9 t WHERE t.order_id > 9 ORDER BY t.order_id LIMIT 3 ) UNION
    ( SELECT * FROM test_9 t WHERE t.order_id < 9 ORDER BY t.order_id DESC LIMIT 3 )
    ) res
    WHERE
    ABS( res.order_id - 9 )
    ORDER BY
    ABS( res.order_id - 9 )
    LIMIT 3

    结果:

    图片说明

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题