Сводный столбец для нормализованных сумм (SQL) - часть 1 - PullRequest
0 голосов
/ 10 марта 2009

У меня есть таблица примерно так:

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 вот сумма голосов за object_id в (1,2). Есть целый другой набор логики, чтобы придумать (1,2), я просто пытался задать самый чистый вопрос, чтобы люди не беспокоились об этой части.

[добавлено 15:10]. Как указано в комментариях, если оценка для одного из объектов ниже 0, возникает проблема. Вот правило: «ЕСЛИ оценка для любого result_id равна -x, И это минимальная оценка для набора, ДОБАВЬТЕ x для всех оценок, чтобы обнулить минимальную оценку». Я могу делать это в свое свободное время, хотя и за пределами SQL - так что это бонус, только если у кого-то есть кахоны, чтобы попытаться решить его в SQL.

Если я сам присоединюсь, я смогу получить сумму. Я не могу понять, как получить нормированную сумму. В идеале это будет работать как в MySQL 5.x, так и в Sqlite3. В противном случае я могу сделать это с двумя отдельными запросами и просто выполнить работу в постобработке.

Ответы [ 3 ]

1 голос
/ 11 марта 2009
-- 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
1 голос
/ 11 марта 2009

Решение без компенсации отрицательных голосов (я включаю это, потому что его намного легче читать / понимать):

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 или хотя бы помогает:))

1 голос
/ 10 марта 2009

Комментарии вполне правильные ... но я сделаю предположение, что 10 - это просто число, которое вы выбрали из своего ... носа.

SELECT object_id AS ObjectID, SUM (голос) + '/ 10' AS NormalizedVote С таблицы GROUP BY object_id

Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...