Формула подсчета очков с положительным / отрицательным рейтингом - PullRequest
0 голосов
/ 08 декабря 2011

Я хотел бы составить линейную формулу оценки, которую я могу использовать в представлении.Однако у меня возникают проблемы при разработке логики.

Данные:

*UserID (int)| *WidgetID (int)| Rank (int) | IsPreferred (bit)
1            | 1              | 1          | 1
1            | 2              | 2          | 1
1            | 3              | 3          | 1
1            | 4              | 1          | 0
1            | 5              | 2          | 0
2            | 1              | 1          | 1

Пользователь № 1 больше всего любит виджет № 1 и больше всего ненавидит виджет № 4.Пользователь № 2 просто любит виджет № 1 (больше всего).

Мне бы хотелось, чтобы мой взгляд выглядел примерно так:

*UserID (int)| *WidgetID (int)| Rank (int) | IsPreferred (bit) | Score (int)
1            | 1              | 1          | 1                 | 3
1            | 2              | 2          | 1                 | 2
1            | 3              | 3          | 1                 | 1
1            | 4              | 1          | 0                 | -2
1            | 5              | 2          | 0                 | -1
2            | 1              | 1          | 1                 | 1

Ранг всегда (на данный момент) имеет абсолютное значениемежду 1-5 (включительно).UserID и WidgetID являются первичными ключами, и приложение устанавливает последовательные уникальные ранги, поэтому мне не нужно беспокоиться о противоречивых результатах.Я думал о том, чтобы сделать что-то вроде этого:

Select *, Case When IsPreferred = 1 Then (5 / Rank) Else -(5 / Rank) End As Score...

Но это экспоненциально и может вызвать проблемы, если мы допустим более 5 рейтингов в будущем ...

Я надеюсь, что я нене нужно делать это в моем приложении, потому что это не очень l33t.Я думаю, что PARTITION или RANK могут помочь мне, но я пока не добился успеха.

У кого-нибудь есть идеи?Спасибо

ОБНОВЛЕНИЕ см. Мой ответ ниже

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Это работает, но я открыт для других идей:

SELECT    UserID, WidgetID, Rank, IsPreferred, Rank() over (Partition BY UserID  order by Rank DESC) as Score
FROM         dbo.Table
Where IsPreferred = 1
Union
SELECT    UserID, WidgetID, Rank, IsPreferred, -1 * Rank() over (Partition BY UserID  order by Rank DESC) as Score
FROM         dbo.Table
Where IsPreferred = 0
ORDER BY UserID, Score
0 голосов
/ 08 декабря 2011

Вам действительно нужно делать это в SQL? Я думаю, что такая формула, поскольку это сложная бизнес-логика, действительно лучше в реальном коде, в зависимости от языка вашего приложения. Я не знаю о вашей среде, поэтому рекомендовать это сложно, но я знаю, что определенно сделаю это на уровне приложений, а не на уровне баз данных.

Преимущества будут включать улучшенную читаемость, тестируемость (вы можете написать модульные тесты, чтобы убедиться, что ваша формула ранжирования работает должным образом) и т. Д.

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