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

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

sql

9个回答

这样应该满足你需求:

 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 就是记录值的列名

Syolin
Lyndon_xl 其中的5 就是你要查找的值,找接近几就改为几就好了,最后 <>5 是排除掉自己这一条数据。
大约 5 年之前 回复

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

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

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

类似与这样:
获取比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

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

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

SELECT * FROM tablename

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

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

建表:

/*
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

结果:

图片说明

zhaoya0111
zhaoya0111 接近9的三条记录
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问