2011-12-08 93 views
0

我想製作一個線性評分公式,我可以在視圖中使用。雖然我在編制邏輯時遇到了麻煩。評分公式與積極/消極排名

數據:

*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的Widget愛#1的最討厭和窗口小部件#4的最多。用戶#2只喜歡Widget#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。我想PARTITIONRANK也許能夠幫助我,但我還沒有成功。

有人有什麼想法嗎?由於

UPDATE看到我的回答below

回答

0

這工作,但我開到其他的想法:

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

你真的需要做的是,在SQL?我正在考慮這種公式,因爲它是複雜的業務邏輯,在實際代碼中會更好,這取決於應用程序的語言。我不知道你的環境,所以很難推薦,但我知道我肯定會在我的應用程序層,而不是在數據庫層。

好處包括更好的可讀性,可測試性(你可以寫單元測試,以確保您的排名公式按預期工作)等