我有一张这样的表:
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。否则,我可以通过两个单独的查询完成此操作,只需在后处理中完成工作。
答案 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或至少有帮助:))