请问 sql 怎样 查询最接近某一值的3条数据?求sql语句如1,2,6,9,120,150,160,查询最接近9的3条记录数值,既1,2,6急急急啊!!!!!!!!!
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 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 就是记录值的列名
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;
#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