MySQL聚合函数找到最接近的值

时间:2016-02-05 16:22:33

标签: mysql

在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可以用来获得单一结果的任何帮助。

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 |
+----------+----------+