What I have is basically a problem which is easily solved with multiple tables, but I have only a single table to do it.
Consider the following database table
<
If you're on SQL Server 2005 or higher,
SELECT UserID, UserName, EmailAddress, Source
FROM (SELECT UserID, UserName, EmailAddress, Source,
ROW_NUMBER() OVER (PARTITION BY UserID
ORDER BY EmailAddress DESC)
AS RowNumber
FROM MyTable) AS a
WHERE a.RowNumber = 1
Of course there are ways to do the same task without the (SQL-Standard) ranking functions such as ROW_NUMBER
, which SQL Server implemented only since 2005 -- including nested dependent queries and self left joins with an ON
including a '>' and a WHERE ... IS NULL
trick -- but the ranking functions make for code that's readable and (in theory) well optimizable by the SQL Server Engine.
Edit: this article is a nice tutorial on ranking, but it uses RANK
in the examples instead of ROW_NUMBER
(or the other ranking function, DENSE_RANK
) -- the distinction matters when there are "ties" among grouped rows in the same partition according to the ordering criteria. this post does a good job explaining the difference.