patternsqlMinor
Find Users by Most Badges
Viewed 0 times
badgesusersmostfind
Problem
I very infrequently use SQL. I need more experience, so I have created a data explorer query to find those users with most of any particular badge (have to edit the query itself right now to alter it). I like following best practices, so please feel free to nit-pick and really do this right (indentation, capitalization, everything).
I have commented code that I cannot get to work (I would like it to work by user input), I hope my intent is quite obvious.
Here's the actual query if you want to run it:
http://data.stackexchange.com/stackoverflow/query/271133/search-users-by-number-of-badges
I have commented code that I cannot get to work (I would like it to work by user input), I hope my intent is quite obvious.
--declare @BadgeName nvarchar(50) = ##BadgeName:string##
--declare @MyTop int = ##MyTop:int##
select
-- top @MyTop
top 100
Badges.UserId as [User Link],
Users.Reputation,
--Badges.Name,
count(Badges.Id) as NumberOfBadges
from
Badges
inner join
Users On Users.Id=Badges.UserId
where
-- Badges.Name = @BadgeName and
Badges.Name = 'Great Answer' and
Users.Reputation > 10000
group by
Badges.UserId, Users.Reputation
order by
NumberOfBadges descHere's the actual query if you want to run it:
http://data.stackexchange.com/stackoverflow/query/271133/search-users-by-number-of-badges
Solution
DECLARE @BadgeName AS NVARCHAR(50) = ##BadgeName:string?Great Answer##;
DECLARE @MyTop AS INT = ##MyTop:int?100##;
SELECT TOP(@MyTop)
Badges.UserId AS [User Link],
Users.Reputation,
@BadgeName AS BadgeName,
COUNT(Badges.Id) AS NumberOfBadges
FROM Badges
INNER JOIN Users ON Users.Id=Badges.UserId
WHERE Badges.Name = @BadgeName
AND Users.Reputation > 10000
GROUP BY Badges.UserId, Users.Reputation
ORDER BY NumberOfBadges DESCThe
DECLARE statements should have semi-colons at the end. Apparently you need the parentheses when using
SELECT TOP with a variable. As you noticed, you need to put columns in the
GROUP BY to include them in the SELECT. You can get around this by using the variable instead of the column. I prefer capitalized keywords and a more compact formatting, but that's really up to you.
Code Snippets
DECLARE @BadgeName AS NVARCHAR(50) = ##BadgeName:string?Great Answer##;
DECLARE @MyTop AS INT = ##MyTop:int?100##;
SELECT TOP(@MyTop)
Badges.UserId AS [User Link],
Users.Reputation,
@BadgeName AS BadgeName,
COUNT(Badges.Id) AS NumberOfBadges
FROM Badges
INNER JOIN Users ON Users.Id=Badges.UserId
WHERE Badges.Name = @BadgeName
AND Users.Reputation > 10000
GROUP BY Badges.UserId, Users.Reputation
ORDER BY NumberOfBadges DESCContext
StackExchange Code Review Q#79817, answer score: 6
Revisions (0)
No revisions yet.