规范化和的汇总列(SQL) - 第1部分

时间:2009-03-10 18:19:29

标签: sql mysql

我有一张这样的表:

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

我想要这个结果(对于这个特定的例子,object_ids 1和2是组的一部分,在别处定义,我正在寻找normalized_score,以便总和= 1. object_id 3是未使用组的一部分。):

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

[已添加3:05 PM] 10这里是(1,2)中object_id的投票总和。还有另外一套逻辑来提出(1,2),我只是想提出最清晰的问题,这样人们就不必担心这一部分了。

[已添加3:10 PM]正如评论中所指出的,如果其中一个对象的得分低于0,则会出现问题。以下是规则,“如果任何outcome_id的分数是-x,那么这是该集合的最低分数,将所有分数添加到所有分数以便将最小分数归零”。我可以在SQL之外的时间内完成这项任务 - 所以只有当有人试图在SQL中解决它时,才能获得奖励。

如果我自己加入,我可以得到这笔钱。我无法弄清楚如何获得归一化的总和。理想情况下,这将适用于MySQL 5.x和Sqlite3。否则,我可以通过两个单独的查询完成此操作,只需在后处理中完成工作。

3 个答案:

答案 0 :(得分:1)

评论是完全正确的..但我会假设10只是你从...中选择的一些数字。

SELECT object_id AS ObjectID,SUM(vote)+'/ 10'AS NormalizedVote 从表 GROUP BY object_id

享受。

答案 1 :(得分: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

答案 2 :(得分: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

(我无法访问MySQL,因此我在Oracle中编写了一个查询,并将||替换为+。希望它适用于MySQL或至少有帮助:))