SQL - SELECT MAX() and accompanying field

后端 未结 4 645
终归单人心
终归单人心 2020-12-31 23:41

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

<
4条回答
  •  攒了一身酷
    2021-01-01 00:05

    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.

提交回复
热议问题