SQL计算在特定范围内行的数量

问题描述:

有两条表在我的数据库: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?谢谢。

+2

对SQL的语法会有所不同按数据块,选择标签为每个数据库使用的是 –

+0

OK,我编辑了标签。@ Sudipta Mondal – Steve

我将与相关子查询做到这一点:

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上测试,看看是否是这种情况。

您可以使用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 

与道路相匹配的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`;