2017-03-03 9 views
0

MySQLを使用している共通の顧客の数が最も多いビジネスのペアを見つけようとしています。SQLで最大の一致数を持つ列のIDのペアを特定

+------------+------------+ 
| BusinessID | CustomerID | 
+------------+------------+ 
| A   |   1 | 
| A   |   2 | 
| A   |   3 | 
| B   |   4 | 
| B   |   1 | 
| B   |   3 | 
| B   |   2 | 
| C   |   3 | 
| C   |   4 | 
| C   |   5 | 
+------------+------------+ 

そして私は、出力は、企業のペアと共通する顧客の数になりたい、このように:

テーブルには、次のようなものです

+-------------+-------------+------------------------+ 
| BusinessID | BusinessID | Common Customers Count | 
+-------------+-------------+------------------------+ 
| A   | B   |      3 | 
| A   | C   |      1 | 
| B   | C   |      2 | 
+-------------+-------------+------------------------+ 

これはクエリです私は書いた:

SELECT a.BusinessID,b.BusinessID,COUNT(*) AS ncom 
FROM (SELECT BusinessID, CustomerID FROM MYTABLE) AS a JOIN  
    (SELECT BusinessID,CustomerID FROM MYTABLE) AS b 
    ON a.BusinessID < b.BusinessID AND a.CustomerID = b.CustomerID 
GROUP BY a.BusinessID, b.BusinessID 
ORDER BY ncom 

私のデータセットは約5mの行を持っていると、これはそうです大規模なデータセットでは非効率的です。データを制限することで、小規模なデータセットのクエリをテストしました.20k行に対して10k行と30秒を処理するのに8秒かかったので、このクエリは5m行には実行できませんでした。クエリをより速く書くために他にどのようにすればよいですか?

+0

奇妙な要件です:

SELECT a.BusinessID, b.BusinessID, COUNT(*) as ncom FROM MYTABLE AS a JOIN MYTABLE AS b ON a.BusinessID < b.BusinessID AND a.CustomerID = b.CustomerID GROUP BY a.BusinessID, b.BusinessID ORDER BY ncom 

また、テーブルに以下の指標を与えます。詳しく教える? – bc004346

+0

@ bc004346スピードに関する要件はありますか?データセット全体でクエリを実行するには、1日でなくても数時間かかるでしょう。ちょうど良い方法がなければならないと思っただけです。 –

答えて

1

テーブルから列を取得するためにサブクエリを使用しないでください。おそらくインデックスを使用できません。

CREATE INDEX ix_cust_bus ON MYTABLE (CustomerID, BusinessID); 
+0

これはトリック、ありがとう!サブクエリがそれを行うことを知らなかった。 –

+0

サブクエリは基本的に一時テーブルを作成します。ただし、索引は構成されていません。 – Barmar

関連する問題