この問題を解決するには、次のことを行う必要があります。
- 列のピボットを解除します
- 自己結合を実行してペアを取得します
- 要約して、最も一般的なペアを取得します。
SQL Serverで動作し、mysqlにごくわずかな変更を加えたソリューションを紹介します。
with allnums as (
select id, 1 as col, num1 as num from t union all
select id, 2 as col, num2 as num from t union all
select id, 3 as col, num3 as num from t union all
select id, 4 as col, num4 as num from t union all
...
)
select top x an1.num, an2.num, count(*)
from allnums an1 join
allnums an2
on an1.id = an2.id and
an1.col < an2.col
order by count(*) desc
mysqlは「with」構文をサポートしていないと思うので、サブクエリを2回繰り返すか、結果を一時テーブルに入れるか、ビューを作成する必要があります。
SQL Serverの「unpivot」など、データベース固有の構造を使用して同じアイデアを表現することもできます。これにより、SQLをいくらか単純化できますが、それほどではありません。
各行に一意のIDがない場合、SQL Serverで簡単に実行できるのは、row_number()関数を使用して、別の「with」ステートメントで1つを割り当てることです。または、すべての数値を文字列に変換してから、それらを連結することもできます。