SQL计算特定范围内的行数

时间:2017-04-06 14:13:11

标签: mysql sql

我的数据库中有两个表:

表A

Column_A1 column_A2
 A1         10
 A2         20
 A3         30

表B

Column_B1 column_B2
 B1         11
 B2         21
 B3         31
 B4         29
 B5         30.5

我想计算表B中有多少行符合以下条件:

范围: A1±1, A2±1, A3±1, ...

例如:

B1∈[A1-1,A1 + 1]
计算这些行,返回值为1。

B2∈[A2-1,A2 + 1]
计算这些行,返回值为1。

B3∈[A3-1,A3 + 1]
B4∈[A3-1,A3 + 1]
B5∈[A3-1,A3 + 1]
计算这些行,返回值为3。

结果应该是这样的:

Column_A1 column_A2 num_match
 A1         10        1
 A2         20        1
 A3         30        3

在其他编程语言中使用循环很容易,但是在SQL中最简单的方法是什么?感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用GROUP BY语句并过滤不等式:

SELECT Column_A1,Column_A2,COUNT(*)
FROM A JOIN B ON column_A2-1 <= column_B2 AND column_B2 <= column_A2+1
GROUP BY Column_A1,Column_A2

答案 1 :(得分:1)

我会使用相关子查询来执行此操作:

select a.*,
       (select count(*)
        from b
        where b.column_b2 between a.column_a2 - 1 and a.column_a2 + 1
       ) as num_match
from a;

注意:使用between表示边界包含在范围内。如果这不是意图,那么使用明确的<>逻辑。

许多数据库都可以利用b(column_b2)上的索引来进行此查询。您可以在MySQL上进行测试,看看是否是这种情况。

答案 2 :(得分:1)

一个简单的查询,与OP表达语句目标的方式相匹配:

SELECT
    a.`Column_A1`,
    COUNT(*) as `NumMatch`
FROM `Table_A` a
JOIN `Table_B` b
ON b.`column_b2` BETWEEN a.`column_A2` - 1 AND a.`column_A2` + 1
GROUP BY a.`Column_A1`;
相关问题