0

给定一个名为 Messages 的数据库表,其中包含以下列:-

MessageID, FromUser, ToUser, Message, DateTime

我想编写一个 SQL 查询,它为“FromUser”列选择不同的值,但我也想要按 DateTime 排序的值。

本质上,一个查询,例如:

SELECT * FROM Messages WHERE ToUser='1' ORDER BY DateTime DESC

然后,使用以下内容选择不同的 FromUser:

SELECT DISTINCT FromUser FROM Messages WHERE ToUser='1'

同时,维护上一个查询的排序。

我尝试使用嵌套查询并遇到问题,因为您无法在内部查询中使用 ORDER BY。

本质上,我希望查询的语法表示(这是无效的,但是......):

SELECT DISTINCT FromUser FROM Messages WHERE ToUser=1 AND FromUser IN 
(SELECT * FROM Messages WHERE ToUser=1 ORDER BY DateTime DESC)
4

5 回答 5

2

我猜这就是你需要的:

;WITH CTE AS
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY [FromUser] ORDER BY [DateTime] DESC) RN
    FROM [Messages]
    WHERE ToUser='1' 
)
SELECT *
FROM CTE
WHERE RN = 1
于 2012-09-04T13:45:38.870 回答
0

您将为每个 FromUser 设置多个时间戳。我将假设您想为每个人使用最后一个时间戳。

select * 
from Messages join 
    (select fromuser, MAX(datetime) as lastdate from Messages
    group by FromUser) as abb1 on abb1.FromUser = messages.FromUser and abb1.lastdate = messages.Datetime
where ToUser = '1'
order by Datetime desc
于 2012-09-04T13:49:21.213 回答
0

另一种方式;

select * from
(
    select *, max(DateTime) over (partition by FromUser) newest
    from Messages
) T
where DateTime = newest

(如果同一个人的日期相同,则为 n 行)

于 2012-09-04T13:53:23.217 回答
0

因此DateTime,在您的select语句中包含,或者按它分组,或者使用聚合函数之一,例如MAX(),像:

    Select fromuser, datetime
    from messages
    where touser = '1'
    group by 
    fromuser, datetime
    order by 
    fromuser, datetime

或者

Select fromuser, max(datetime) as max_datetime
from messages
where touser = '1'
group by 
fromuser
于 2012-09-04T13:47:06.367 回答
0
SELECT DISTINCT [Messages].[FromUser] FROM (
SELECT [FromUser] as [FromUser], MAX(DateTime) as [Date]
FROM [Messages]
GROUP BY [FromUser]) as [Messages]
于 2012-09-04T13:50:03.550 回答