在codereview.stackexchange.com上计算StackExchange应该赠送给顶级用户的杯子数(以便毕业),这样我也将收到一个。 (输出可被50整除)。
代码
DECLARE @mugs INT,@rounded_mugs INT,@inc INT,@remainder INT;
SELECT @mugs = COUNT(1) FROM Users WHERE Reputation >=
(SELECT Reputation FROM Users WHERE DisplayName='JaDogg');
SET @remainder = @mugs%50;
IF (@remainder = 0) SET @inc = 0 ELSE SET @inc=50-@remainder;
SELECT @mugs+@inc AS 'AMOUNT OF MUGS TO GIVE AWAY';
链接
计算要赠送的杯子数量我会收到一个
#1 楼
文档我认为查询的目的是查看您的声誉排名,然后四舍五入到最接近的50。最好单击“编辑描述”并记录该文档以使所有人受益其他使用Stack Exchange Data Explorer。
通用性
Data Explorer允许参数化。使用它。
样式
您不必为这种简单的查询声明变量。在SQL中,尝试说出您想要的内容。不要说明计算它的步骤。
避免定义变量的一种好方法是改用Common Table Expressions(
WITH
子句)。简洁性
使用相关功能
RANK()
和CEILING()
会有所帮助。WITH UserRanks AS (
SELECT DisplayName
, RANK() OVER (ORDER BY Reputation DESC) AS RepRank
FROM Users
)
SELECT *, 50 * CEILING((RepRank + 0.0) / 50) AS BatchedRepRank
FROM UserRanks
WHERE DisplayName = ##Username:string##;
评论
\ $ \ begingroup \ $
由于RepRank是整数,因此您也可以执行50 *((RepRank + 49)/ 50)以避免类型转换。
\ $ \ endgroup \ $
–蓬松
2014年10月24日,下午5:16
\ $ \ begingroup \ $
愚蠢的我。我只需要一个CTE,而不是两个。在修订版2中已更正。
\ $ \ endgroup \ $
– 200_success
14-10-24在8:34
#2 楼
从风格上讲,我将像在程序代码中一样声明变量:每个变量都在一行上。嵌套的Select以及计算代码也显得有些强迫和局促。您可能想在其中添加一些空格;)
好了,现在,我实际上不希望您得到一个杯子,但我想要一个我自己……稍微开玩笑
要送给我几个杯子,我才能收到一个?您的查询无法回答。正如Mat'sMug(badum,tss)在评论中指出的那样,您可以使用用户名参数。
我会这样写:
DECLARE @mugs INT;
DECLARE @rounded_mugs INT;
DECLARE @inc INT;
DECLARE @remainder INT;
SELECT @mugs = COUNT(1)
FROM Users
WHERE Reputation >= (SELECT Reputation FROM Users WHERE DisplayName=##username:string?Community##);
SET @remainder = @mugs%50;
IF (@remainder = 0)
SET @inc = 0
ELSE
SET @inc=50-@remainder;
SELECT @mugs+@inc AS 'Amount of mugs to give away';
评论
该查询可以使用用户名参数;)@ Mat'sMug不要窃取我的评论;)
您可以在SE用户信誉联盟中获得历史排名:stackexchange.com/leagues/86/alltime/codereview