在MySQL中,是否有任何聚合函数(或任何其他方法)来找到与特定值最接近的值?
例如,我正在寻找门牌号为15的地址。或者,当某些街道没有15号房子时,应该返回最近的门牌号码(如14或16):
SELECT closest(house_no, 15), street_name
FROM addresses
GROUP BY street_name
由于需要汇总,我无法看到ORDER BY ABS(house_no - 15) LIMIT 1
可以用来获得单一结果的任何帮助。
答案 0 :(得分:2)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(street VARCHAR(12) NOT NULL
,house_no INT NOT NULL
,PRIMARY KEY(street,house_no)
);
INSERT INTO my_table VALUES
('street_1',11),
('street_1',12),
('street_1',13),
('street_1',14),
('street_2',12),
('street_2',13),
('street_2',14),
('street_2',15),
('street_3',13),
('street_3',14),
('street_3',16),
('street_4',16),
('street_4',17),
('street_4',18),
('street_4',19);
SELECT x.*
FROM my_table x
JOIN
( SELECT street, MIN(ABS(house_no-15)) best_match FROM my_table GROUP BY street) y
ON y.street = x.street
AND y.best_match = ABS(x.house_no-15);
+----------+----------+
| street | house_no |
+----------+----------+
| street_1 | 14 |
| street_2 | 15 |
| street_3 | 14 |
| street_3 | 16 |
| street_4 | 16 |
+----------+----------+