5

皆様、明けましておめでとうございます

状況:

MySQL db にいくつかのテーブルがあります。

スコア: (一意の ID、一意の (objectID、metricID))

| ID     | ObjectID | MetricID | Score    |
|--------+----------+----------+----------|
|0       | 1        | 7        | 0        | 
|1       | 5        | 3        | 13       |
|2       | 7        | 2        | 78       |
|3       | 7        | 3        | 22       |
|.....
|--------+----------+----------+----------|

オブジェクト: (一意の ID、一意の ObjectName)

| ID     | ObjectName |
|--------+------------|
|0       | Ook        | 
|1       | Oop        |
|2       | Oww        |
|3       | Oat        |
|.....
|--------+------------|

メトリクス: (一意の ID、一意の MetricName)

| ID     | MetricName |
|--------+------------|
|0       | Moo        | 
|1       | Mar        |
|2       | Mee        |
|3       | Meep       |
|.....
|--------+------------|

特定のオブジェクト ID の場合:

  • 「0」から「メトリックごとに 1 つ」までのスコアがいくつかあります。

要件:

特定の ObjectID について、次の基準に基づいて並べ替えられたリストを返したいと考えています。

  • 提供されたオブジェクトとの類似性の順にランク付けされた返された行
  • 提供されたオブジェクトを含まない返された行
  • (これは私が思う難しいビットです)類似性の順序は、エントリがあるメトリックの提供されたオブジェクトのスコアからのスコアの数値オフセット/差に基づいて、提供されたオブジェクトからのオブジェクトの「スコア距離」によって決定されます提供されたオブジェクトと現在調べられているオブジェクトの両方
  • objectID、オブジェクト名、スコア差 (または類似のもの) が含まれます

問題文:

これに使用する正しい SQL 構文がわかりません。これまでの実験は失敗しました。私はこの作業を可能な限り DB で行い、コード内の厄介な for ループなどでこの作業をほとんど、またはまったく実行したくありません。

追加の非機能要素

  • 現在、Scores テーブルには 200 行しかありません。私の計算によると、最終的には最大で約 2,000,000 行になる可能性がありますが、おそらくそれ以上はありません。
  • Objects テーブルには最大で約 5000 行しかありません
  • Metrics テーブルには、最大で約 400 行しかありません。
4

1 に答える 1

1

オブジェクト 1 との類似性に基づいてオブジェクトを並べ替える方法を次に示します。

select  other.ObjectID
,       avg(abs(target.Score - other.Score)) as Delta
from    Scores target
join    Scores other
on      other.MetricID = target.MetricID
        and other.ObjectID <> target.ObjectID
where   target.ObjectID = 1
group by
        other.ObjectID
order by
        Delta

類似性は、共通のメトリックの平均差として定義されます。オブジェクト 1 と少なくとも 1 つのメトリックを共有しないオブジェクトはリストされません。この回答が間違った仮定をしている場合は、質問を明確にしてください:)

SQL Fiddle での実例。

于 2013-01-01T14:55:12.363 に答える