Description

在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';


链接

计算要赠送的杯子数量我会收到一个

评论

该查询可以使用用户名参数;)

@ Mat'sMug不要窃取我的评论;)

您可以在SE用户信誉联盟中获得历史排名:stackexchange.com/leagues/86/alltime/codereview

#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';