0

表に表示される最も頻繁な数値のペアをSQLを使用して見つけることが可能であれば、私は傷つきます。すなわち:私は数字で埋められたいくつかの列を持っています:

num1, num2, num3, num4, num5, num6
2      3      4     5     6    7

もちろん、行数はもっと多いですが、あなたは考えを持っています。目標は、たとえば、行に表示された10組の数字を表示することです。

可能であれば教えてください。そうでない場合は、「ブルートフォース」のような解決策を実行する必要があります。

よろしく

4

2 に答える 2

1

これを試して。

SELECT TOP 10 num1, num2, num3, num4, num5, num6
FROM MyTable
GROUP BY num1, num2, num3, num4, num5, num6
ORDER BY COUNT(*) DESC

タプルに必要なすべての個別の列でGROUPBYを使用します。次に、ORDERBYCOUNT関数。これにより、すべての異なる番号のセットのリストが取得されます。結果の数を制限するには、SELECTステートメントにTOP10を含めます。

注:元の投稿には、MySqlタグとsql-serverタグの両方が含まれています。このソリューションはSQLServerで機能します。MySqlにはTOP機能が存在しないため、同様の機能を持つLIMITを使用する必要があります。使用方法の詳細が必要な場合は、 LIMITのドキュメントを参照してください。

于 2012-05-21T17:36:50.393 に答える
1

この問題を解決するには、次のことを行う必要があります。

  1. 列のピボットを解除します
  2. 自己結合を実行してペアを取得します
  3. 要約して、最も一般的なペアを取得します。

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つを割り当てることです。または、すべての数値を文字列に変換してから、それらを連結することもできます。

于 2012-05-21T17:53:39.817 に答える