SQL如何按显示分组中的所有记录

SQL如何按显示分组中的所有记录,sql,sql-server,Sql,Sql Server,我有这样一个表结构: UserID | Firstname | LastName | DateTime ------------------------------------------- 1 | John | Doe | 2015-04-27 2 | Karl | Watts | 2015-04-26 1 | John | Doe | 2015-04-25 3 | Jane |

我有这样一个表结构:

UserID  | Firstname | LastName | DateTime
-------------------------------------------
1       | John      | Doe      | 2015-04-27
2       | Karl      | Watts    | 2015-04-26
1       | John      | Doe      | 2015-04-25
3       | Jane      | Howard   | 2015-04-28
有没有一种方法可以编写一个查询来获取按日期时间排序但按用户ID分组的数据?我希望记录的顶部有最近的DateTime,其余的用户记录都要跟随。然后,它应该是下一个具有最新日期的用户,后跟他们的所有记录。像这样:

UserID  | Firstname | LastName | DateTime
-------------------------------------------
3       | Jane      | Howard   | 2015-04-28
1       | John      | Doe      | 2015-04-27
1       | John      | Doe      | 2015-04-25
2       | Karl      | Watts    | 2015-04-26
我只是不知道用一个查询就可以做到这一点。到目前为止,我提出了以下问题:

SELECT UserID, FirstName, LastName, MAX(DateTime) as MaxDateTime
FROM Table
GROUP BY UserID, FirstName, LastName
ORDER BY MaxDateTime DESC
它以正确的顺序为我提供了最新的记录,但我不知道如何为每个用户包含其余的记录。我想我需要使用一个连接,但是当我这样做的时候,一组一组地把所有的东西都放在一起(这是应该的)

编辑:

  • 是的,它需要正常化
  • 这是SQLServer2008R2,我确认它与2008及更高版本兼容,所以这很完美
  • 在tie的情况下,较低的UserID首先起作用
  • 您可以对聚合使用
    OVER()
    ,以获得聚合,而无需对所有字段进行分组:

    SELECT UserID
         , FirstName
         , LastName
         , DateTime
         , MAX(DateTime) OVER(PARTITION BY UserID) as MaxDateTime
    FROM Table
    ORDER BY MaxDateTime DESC,UserID,DateTime DESC
    
    如果不想返回
    MaxDateTime
    ,可以将其限制为
    顺序:

    SELECT UserID
         , FirstName
         , LastName
         , DateTime         
    FROM Table
    ORDER BY MAX(DateTime) OVER(PARTITION BY UserID) DESC, UserID,DateTime DESC
    
    演示:


    编辑:注意,如果是平局,这将首先返回较低的
    用户ID

    如果是平局,这将提供根据MAX(DateTime)排序的结果,并按用户ID升序排序。输出按日期时间降序显示每个用户的行

    SELECT
        MaxT.UserID,
        T.FirstName,
        T.LastName,
        T.DateTime
    FROM
        (
        SELECT
            UserID,
            MAX(DateTime) AS MaxDateTime
        FROM
            MyTable
        GROUP BY
            UserID
        ) AS MaxT
        INNER JOIN MyTable AS T ON
            T.UserID = MaxT.UserID
    ORDER BY
        MaxT.MaxDateTime DESC,
        MaxT.UserID ASC,
        T.DateTime DESC
    

    你所说的行的剩余部分是什么意思?您在这里使用的是聚合。顺便说一句,您的表似乎非常需要规范化。您不应在多个表中存储用户信息。将名字和姓氏放在这个表中清楚地表明您有重复的数据。您使用的是哪个版本的SQL?ties会发生什么情况,例如当超过个用户具有相同的MaxDateTime值时?我看到您已经编辑了很多<在这种情况下,
    OVER
    子句中需要code>partitionby
    ,否则,
    OVER()
    只会为每一行返回相同的日期。现在是+1。