怎样用SQL得到会话列表,日期为最大值

guoruixing 2014-06-06 07:32:37
形如短信的会话列表
数据库如下
表名:Messages
字段:
ID(自动编号)
ToEmpID(接收人ID)
FromEmpID(发送人ID)
SendDate(发送日期)
Detail(内容)

求检索出接收人和发送人都不会重复的会话列表,日期为最大日期,且按日期倒序排序,就像智能手机上的短信会话模式一样。
例如我叫张三

最后结果:

发送人 接收人 最新日期

张三 李四 6月6日
王五 张三 6月3日
刘六 张三 6月2日

(第一行发送人是“张三”,是因为最近是我发出给李四的信息,所以结果后面不能再显示李四发给我的记录)

...全文
130 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoruixing 2014-06-08
  • 打赏
  • 举报
回复
引用 5 楼 Benjayming 的回复:
DECLARE @Message TABLE(ID INT,ToEmpID NVARCHAR(200),FromEmpID NVARCHAR(200),SendDate DATETIME,Detail NVARCHAR(500))

INSERT INTO @Message(ID,ToEmpID,FromEmpID,SendDate,Detail)
SELECT 1,'张三','李四','2014/06/05','ha ha' UNION ALL
SELECT 2,'李四','张三','2014/06/06','he he' UNION ALL
SELECT 3,'张三','李四','2014/06/07','bye bye' UNION ALL
SELECT 4,'张三','王五','2014/05/05','SB' UNION ALL
SELECT 5,'王五','张三','2014/05/07','NB' UNION ALL
SELECT 6,'刘六','张三','2014/05/02','ML' UNION ALL
SELECT 7,'张三','刘六','2014/06/07','DL' 

SELECT  FromEmpID AS 发件人
	   ,ToEmpID AS 收件人
	   ,SendDate AS 最新日期
FROM @Message a
WHERE NOT EXISTS(SELECT * FROM @Message 
                 WHERE ((a.ToEmpID = ToEmpID AND a.FromEmpID = FromEmpID) 
                 OR    (a.ToEmpID = FromEmpID AND a.FromEmpID = ToEmpID)) 
                 AND    SendDate > a.SendDate)


发件人                         收件人                                 最新日期
----------------------------- --------------------------------------------------------
李四                            张三                                   2014-06-07 00:00:00.000
张三                            王五                                   2014-05-07 00:00:00.000
刘六                            张三                                   2014-06-07 00:00:00.000
                            
(3 行受影响)  
解决了,非常感谢,测试的时候吓一跳,发现有重复的,检查发现两个日期一摸一样,因为测试数据只输入了日期后面没时间,加上时间就好了
lzw_0736 2014-06-07
  • 打赏
  • 举报
回复

WITH Messages (ID,ToEmpID,FromEmpID,SendDate,Detail) AS
(
SELECT 1,'张三','李四','2014/06/05','a' UNION ALL
SELECT 2,'王五','张三','2014/06/03','b' UNION ALL
SELECT 3,'刘六','张三','2014/06/02','b' UNION ALL
SELECT 4,'张三','李四','2014/05/05','a' UNION ALL
SELECT 5,'王五','张三','2014/05/03','b' UNION ALL
SELECT 6,'刘六','张三','2014/05/02','b'
)
SELECT ID,ToEmpID,FromEmpID,SendDate FROM Messages a
WHERE ID in
(
	SELECT TOP 1 ID 
	FROM Messages
	where ToEmpID=a.ToEmpID AND FromEmpID=a.FromEmpID 
	ORDER BY SendDate DESC
)
詩和遠方 2014-06-07
  • 打赏
  • 举报
回复
DECLARE @Message TABLE(ID INT,ToEmpID NVARCHAR(200),FromEmpID NVARCHAR(200),SendDate DATETIME,Detail NVARCHAR(500))

INSERT INTO @Message(ID,ToEmpID,FromEmpID,SendDate,Detail)
SELECT 1,'张三','李四','2014/06/05','ha ha' UNION ALL
SELECT 2,'李四','张三','2014/06/06','he he' UNION ALL
SELECT 3,'张三','李四','2014/06/07','bye bye' UNION ALL
SELECT 4,'张三','王五','2014/05/05','SB' UNION ALL
SELECT 5,'王五','张三','2014/05/07','NB' UNION ALL
SELECT 6,'刘六','张三','2014/05/02','ML' UNION ALL
SELECT 7,'张三','刘六','2014/06/07','DL' 

SELECT  FromEmpID AS 发件人
	   ,ToEmpID AS 收件人
	   ,SendDate AS 最新日期
FROM @Message a
WHERE NOT EXISTS(SELECT * FROM @Message 
                 WHERE ((a.ToEmpID = ToEmpID AND a.FromEmpID = FromEmpID) 
                 OR    (a.ToEmpID = FromEmpID AND a.FromEmpID = ToEmpID)) 
                 AND    SendDate > a.SendDate)


发件人                         收件人                                 最新日期
----------------------------- --------------------------------------------------------
李四                            张三                                   2014-06-07 00:00:00.000
张三                            王五                                   2014-05-07 00:00:00.000
刘六                            张三                                   2014-06-07 00:00:00.000
                            
(3 行受影响)  
guoruixing 2014-06-07
  • 打赏
  • 举报
回复
引用 3 楼 lzw_0736 的回复:
最好提供双向的数据实例以及你期待的查询结果
就在你的数据基础上随便添加一条反向的,比如:已经有了SELECT 1,'张三','李四','2014/06/05','a',那么加一条 SELECT 7,'李四','张三','2014/06/05','a' ,如果ID为7的日期是最新的,那么结果中就只有7,而没有1,如果ID为1的日期是最新的,那么结果中就只有1而没有7
lzw_0736 2014-06-07
  • 打赏
  • 举报
回复
最好提供双向的数据实例以及你期待的查询结果
guoruixing 2014-06-07
  • 打赏
  • 举报
回复
引用 1 楼 lzw_0736 的回复:

WITH Messages (ID,ToEmpID,FromEmpID,SendDate,Detail) AS
(
SELECT 1,'张三','李四','2014/06/05','a' UNION ALL
SELECT 2,'王五','张三','2014/06/03','b' UNION ALL
SELECT 3,'刘六','张三','2014/06/02','b' UNION ALL
SELECT 4,'张三','李四','2014/05/05','a' UNION ALL
SELECT 5,'王五','张三','2014/05/03','b' UNION ALL
SELECT 6,'刘六','张三','2014/05/02','b'
)
SELECT ID,ToEmpID,FromEmpID,SendDate FROM Messages a
WHERE ID in
(
	SELECT TOP 1 ID 
	FROM Messages
	where ToEmpID=a.ToEmpID AND FromEmpID=a.FromEmpID 
	ORDER BY SendDate DESC
)
谢谢,不过这个不对啊,你用的数据都是单向发送的,消息是双向发送的,张三可以给李四发送消息,李四也能给张三发送,如果是双向的,你这个就有问题了,再次谢谢。期待大侠啊

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧