代码应该相对来说是不言而喻的。我想知道网站上的顶级选民在网站上“创造”了多少代表,而他们“拥有”了多少代表。
因此,我创建了一个小的SEDE-查询,我现在想知道,如果我遵循良好的SQL实践,以及如何提高查询的性能(尽管它已经相当简单了.)
WITH Voters AS(
SELECT DISTINCT UpVotes, DownVotes, Id, Reputation
FROM Users
WHERE Reputation != 101 AND Reputation != 1 --Exclude users without repchanges
)
SELECT TOP ##topX:int?20##
Users.Id as [UserLink],
Users.DisplayName as [SortName],
Voters.Upvotes * 8 as [EstimatedAddedRep],
--as there is no split between question and answer votes
-- we take 8 as median in accordance to the tendency that there are more
-- answer votes (10 rep) than question votes (5 rep)
Voters.Downvotes * 3 as [EstimatedDestroyedRep],
Users.Reputation as [OwnedRep],
Voters.Upvotes * 8 / Users.Reputation as [Ratio]
FROM Users, Voters
WHERE users.id = Voters.Id
GROUP BY Users.Id, Users.DisplayName, Users.Reputation, Voters.UpVotes, Voters.DownVotes
ORDER BY EstimatedAddedRep DESC对于任何想要运行最新查询的人,您可以在这里这样做:代表“创建”与topX选民拥有的“代表”
发布于 2014-05-16 15:09:46
首先,当您选择并想要在上面执行数学时,您应该直接指定您想要做的事情。
而不是
Voters.Upvotes * 8 as [EstimatedAddedRep], 它应该是
(Voters.Upvotes * 8) AS [EstimatedAddedRep] 和
Voters.Upvotes * 8 / Users.Reputation as [Ratio]应该是
((Voters.Upvotes * 8) / (Users.Reputation)) as [Ratio]在代码中执行算术时,应该始终使用括号指定,因为它并不总是执行您认为它将完成的任务。
我不会用我的FROM和WHERE语句来做这个
FROM Users, Voters
WHERE users.id = Voters.Id我会这么做的
FROM Users INNER JOIN Voters ON Users.Id = Voters.Id省去WHERE条款。
对于聊天中提到的问题,您只需要像这样添加它(简单的查询,而不是在select中重复自己的问题)。
((Voters.Upvotes * 8) / Users.Reputation) AS RepCreated --?????检查您的所有列和表,您有一些奇怪的大小写问题,有时您大写,有时不,这是很难找出什么是正确的
发布于 2014-05-16 15:09:54
虽然它对SQL引擎没有什么区别(几乎没有),但以浮点数的形式生成结果比率对用户来说可能更友好,而不是整数(可能在小数点之后只舍入一两位)。
这对于任何用户来说尤其如此,他们的代表(甚至略高于他们估计的数量)都是如此。向所有这样的用户展示一个0的比率,基本上是让他们在头脑中做一些数学来计算真实比率的概念。
发布于 2014-05-16 17:22:46
我可能弄错了,但我的印象是!=不是很好的SQL实践,而<>更可取。
例如:
WHERE Reputation <> 101 AND Reputation <> 1 --Exclude users without repchangeshttps://codereview.stackexchange.com/questions/50920
复制相似问题