2017-04-06 219 views
0

有兩條表在我的數據庫: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

回答

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上測試,看看是否是這種情況。

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

與道路相匹配的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`; 
相關問題