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?谢谢。
答
我将与相关子查询做到这一点:
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`;
对SQL的语法会有所不同按数据块,选择标签为每个数据库使用的是 –
OK,我编辑了标签。@ Sudipta Mondal – Steve