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
它以正确的顺序为我提供了最新的记录,但我不知道如何为每个用户包含其余的记录。我想我需要使用一个连接,但是当我这样做的时候,一组一组地把所有的东西都放在一起(这是应该的)
编辑:
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。