2009-03-10 3 views
0

私はそうのようなテーブルがあります。私は、この結果は(この特定の例のために、のobject_id 1及び2は、グループの一部である、他の場所で定義されたいロールアップコラム - パート1

object_id | vote 
1 | 2 
1 | -1 
1 | 5 
2 | 3 
2 | 1 
3 | 4 
3 | -2 

を合計は常に= 1のobject_id 3未使用のグループの一部であるように、と私はnormalized_scoreを探しています):。

object_id | normalized_score 
1 | 6/10 
2 | 4/10 

ここ10がために票の合計です[15:05を追加しました] object_id in(1,2)。 (1,2)を思いつくための論理は他にもありますが、私は人々がその部分について心配する必要がないように、最もクリーンな質問をしようとしていました。

[追加された午後3時10分]コメントの中で指摘されているように、オブジェクトの1つのスコアが0未満の場合、問題が発生します。 "outcome_idのスコアが-xであり、それがセットの最小スコアであれば、最小スコアをゼロにするためにすべてのスコアにxを加える"というルールがあります。私はSQLの外では自分の時間にこれを行うことができます - 誰かがSQLでそれに取り組もうとするカホンを持っている場合のみボーナスです。

私が自己結合をすると、私は合計を得ることができます。私は正規化された合計を取得する方法を把握することはできません。理想的には、これはMySQL 5.xとSqlite3の両方で動作します。そうでなければ、私は2つの別々のクエリでこれを行うことができ、ちょうど後処理で作業を行います。

+0

「10」はどこに入ってきますか? –

+0

投票が10を超えていると思われる場合、どのように否定的な投票を許可できますか? –

+0

私は申し訳ありません10は(1,2)のobject_idの票の合計です。質問を更新します –

答えて

1

反対票を補償せずに解決策(その方がはるかに簡単に理解/読み取るためので、私はこの1つが含まれる):

SELECT object_id 
,  SUM(vote) + '/' + total AS normalized_score 
FROM tabel 
,  (
     SELECT sum(vote) AS total 
     FROM tabel 
     ) 
GROUP BY object_id, total 

完全なソリューション:

SELECT object_id 
,  SUM(vote + minvote) + '/' + (total + minvote * count) AS normalized_score 
FROM tabel 
,  (
     SELECT sum(vote) AS total 
     ,  CASE WHEN MIN(vote) < 0 THEN 
        -MIN(vote) 
       END AS minvote 
     ,  COUNT(*) AS count 
     FROM tabel 
     ) 
GROUP BY object_id, total, minvote, count 

(Iドン」私はMySQLにアクセスしているので、Oracleでクエリを書いて、||の代わりに||それがMySQLで動作することを望むか、少なくとも助けてください:)

+0

うん - サブクエリが必要だと思っていた。私は通常それらを避けようとしていますが、サブクエリ以外の解決策があると確信していますが、それは数十万レコードに満たないはずです。素晴らしい答えをありがとう。 –

1

コメントはかなり正しいですが、私はあなたがあなたの鼻から選んだ数字のほんの一部であるという前提を立てます。

は、オブジェクトID、SUM(投票)などのobject_id SELECT +のobject_id

BYテーブル グループからNormalizedVote AS '/ 10' をお楽しみください。

+0

申し訳ありませんが、わかりませんでした。 '10'はそのグループの他のすべての投票の合計です - そうでなければこれは些細な質問でしょう。私は質問を更新します。 –

1
 
-- SQL solution 
SELECT 
    object_id AS ObjectID, 
    (SUM(CASE SIGN(vote) WHEN 1 THEN vote ELSE 0 END) - 
    ((CASE SIGN(MIN(vote)) WHEN -1 THEN MIN(vote) ELSE 0) * 
    (COUNT(1)))) + '/10' AS NormalizedVote 
FROM table 
GROUP BY object_id 
+0

答えとしてマークしたもの(それは修正可能ですが)と同様に、SUM()にはobject_id = 3の投票が含まれていますが、これは機能しません。私はサブクエリがないのが好きです - 入力のおかげで。 –