Microsoft SQL Server:连接两个表的最大日期

时间:2016-04-20 21:47:01

标签: sql sql-server join maxdate

我正在尝试连接两个表,同时从一个表中提取最大日期。 我有一张学生桌和一张交流桌。每个学生在学生表中都是独一无二的,并且有很多交流条目。

我想创建一个SQL脚本,用于提取每个学生的ID,姓名,最新通信日期以及该日期的通信消息。

我可以使用max(comm_date)group by为每个学生提取最新日期,但在提取相应的通信消息时,事情会变得混乱(许多重复)。

表:学生

studentid, name

表:通讯

studentid, comm_date, comm_msg

结果:

student.studentid, student.name, communications.comm_date, communications.comm_msg

如何提取max(comm_date)给出的相应通讯讯息?

2 个答案:

答案 0 :(得分:1)

这应该可以满足您的需求。我不知道通过嵌套子查询是否有性能影响,但我喜欢这种干净的语法:

SELECT 
   s.studentid, 
   s.name, 
   LastCommDate = MAX(c.comm_date), 
   LastCommMessage = (SELECT comm_msg FROM Communications WHERE studentid = s.studentid AND comm_date = MAX(c.comm_date))
FROM Student AS s 
INNER JOIN Communications AS c
ON s.studentid = c.studentid
GROUP BY s.studentid, s.name

答案 1 :(得分:0)

这应该得到你所需要的......

select
      s.studentid,
      s.name,
      c2.comm_date,
      c2.comm_msg
   from
      Student s
         LEFT JOIN 
         ( select 
                 c1.studentid,
                 max( c1.comm_Date ) as MaxDate
              from
                 Communications c1
              group by
                 c1.studentid ) PreMax
            on s.studentid = PreMax.StudentID
            LEFT JOIN Communications c2
               on PreMax.StudentID = c2.StudentID
              AND PreMax.MaxDate = c2.comm_Dat

此外,我建议在学生表中添加一列用于最近的通信日期(如果通信具有自动增量列,例如同一天的多个条目,则建议添加一个ID)。然后,通过插入触发器到通信表,您使用最新的日期(或通信ID)更新学生表。然后你永远不需要继续重新查询MAX()并重新连接多次,就像这一样。