在SQL Server 2008中按用户名选择最新的记录组

Gon*_*ndy 1 sql t-sql sql-server-2008

我有一个包含这些数据的表格:

ID   voting_ID   username   timestamp              XMLBallot
1    9           voter01    23. 4. 2012 8:54:45    xmldata
2    9           voter01    21. 4. 2012 14:00:34   xmldata
3    9           voter02    20. 4. 2012 16:01:10   xmldata
4    11          voter01    23. 4. 2012 8:40:45    xmldata
5    9           voter03    19. 4. 2012 21:18:49   xmldata
Run Code Online (Sandbox Code Playgroud)

我需要为特定的每个选民(用户名)只获得一个最新的选票voting_ID.

例如,我需要返回数据 @voting_ID=9

ID   voting_ID   username   timestamp              XMLBallot
1    9           voter01    23. 4. 2012 8:54:45    xmldata
3    9           voter02    20. 4. 2012 16:01:10   xmldata
5    9           voter03    19. 4. 2012 21:18:49   xmldata
Run Code Online (Sandbox Code Playgroud)

请帮我构建那个SQL Server 2008查询..谢谢PS:表名是 ballots

Lie*_*ers 5

这里有几个选项,但使用添加ROW_NUMBER分组user和排序(降序)可以timestamp让您轻松选择最新记录.

使用ROW_NUMBER

SELECT *
FROM   (
         SELECT ID, voting_ID, username, timestamp, XMLBallot
                , rn = ROW_NUMBER() OVER (PARTITION BY voting_ID, username ORDER BY timestamp DESC)
         FROM   Ballots
       ) bt 
WHERE  rn = 1
Run Code Online (Sandbox Code Playgroud)

或者,您可以选择每个用户的最大时间戳并加入其中.

使用MAX

SELECT bt.ID, bt.voting_ID, bt.username, bt.timestamp, bt.XMLBallot
FROM   Ballots bt
       INNER JOIN (
          SELECT username, voting_ID, timestamp = MAX(timestamp)
          FROM   Ballots
          GROUP BY
                 username, voting_ID
        ) btm ON btm.username = bt.Username
                 AND btm.voting_ID = bt.voting_ID
                 AND btm.timestamp = bt.timestamp
Run Code Online (Sandbox Code Playgroud)