使用 BETWEEN 创建独占的间隔集

Using BETWEEN to create exclusive set of intervals

我有一个包含 id 和 distance 列的数据库。我需要计算一定距离之间的 ID 数量。

比如我想统计距离在1km到2km之间有多少个id,所以我用的是这个代码:

SELECT COUNT (distance)
FROM table
WHERE distance BETWEEN 1000 AND 2000
-- Returns a COUNT of 240,600

当我想计算 2km 和 3km 之间的 ID 数量时,我使用了相同的查询,但是“2km”值在两个查询中都被计算在内,因为包含 BETWEEN 运算符。

SELECT COUNT (distance)
FROM table
WHERE distance BETWEEN 2000 AND 3000
-- Returns a COUNT of 353,440

据我了解,上面的两个查询都将包含距离恰好为 2000 的行。

我很想知道是否有另一种方法来计算距离之类的东西(并且有很多行)或者我是否需要 GROUP BY 然后计数?

你可以试试这种方法来得到直方图table

SELECT DIV(distance, 1000) * 1000 distance_from,
       (DIV(distance, 1000) * 1000) + 999 distance_to,
       COUNT(*) num
  FROM mytable
GROUP BY DIV(distance, 1000) * 1000

当您将表达式 DIV(distance, 1000)GROUP BY 一起使用时,它会创建距离值组。

如您所见,BETWEEN 在处理数字范围方面的作用有限。您可能需要 distance >= 1000 AND distance < 2000 范围 [1000, 2000]。

根据 SQL 规范,这个表达式:

WHERE distance BETWEEN 1000 AND 2000

等同于:

WHERE distance >= 1000 AND distance <= 2000

据我了解,您需要从端点之一中删除 = 以创建互斥范围。根据您对 1km 和 2km 之间的定义,应使用以下一组条件之一:

WHERE distance >= 0    AND distance < 1000
WHERE distance >= 1000 AND distance < 2000
WHERE distance >= 2000 AND distance < 3000

WHERE                     distance <= 1000
WHERE distance > 1000 AND distance <= 2000
WHERE distance > 2000 AND distance <= 3000