sql - 获取行中日期值之前的最新日期

标签 sql sql-server sql-server-2008

我使用的是 MSSQL 2008 R2。我正在尝试获取最新数据日期到存储在另一列中的日期。我可以在子查询中使用 max(ProcedureDate) 提取最新的数据日期;但是,我需要列中存储的日期之前的最新日期。

这是一个例子:

Current Table: Procedures       

ID Patient  ProcedureType   ProcedureDate
1  George   ExamA           1/1/2013
2  George   TreatmentA      1/3/2013
2  George   TreatmentB      1/5/2003
4  George   ExamB           2/1/2013
5  George   TreatmentA      2/5/2013

Desired Table:  ProceduresWithLastExam

ID Patient  ProcedureType   ProcedureDate   LastExamDate    DaysSinceLastExam    LastExamType
1  George   ExamA           1/1/2013        1/1/2013        0                    ExamA
2  George   TreatmentA      1/3/2013        1/1/2013        2                    ExamA
3  George   TreatmentB      1/5/2013        1/1/2013        4                    ExamA
4  George   ExamB           2/1/2013        2/1/2013        0                    ExamB
5  George   TreatmentA      2/5/2013        2/1/2013        4                    ExamB

我尝试使用以下内容,但它仅拉回该患者的最新数据日期。

select p.*, a.LastExamDate, a.ProcedureType as LastExamType from Procedures p
left join (
   select exams.Patient, exams.ProcedureType, MAX(exams.ProcedureDate) as LastExamDate from Procedures exams
   where ProcedureType like 'Exam%'
   group by exams.Patient, exams.ProcedureType
)a
on p.Patient = a.Patient

所有行的 LastExamDate 和 ExamB 的结果均为 2/1/13。

我尝试在左连接、where 子句和子查询中包含一些额外的日期参数,但没有成功。

请注意,我省略了 datediff 逻辑,直到我能够返回正确的日期为止。

预先感谢您的帮助。

最佳答案

您可以使用OUTER APPLY 。它类似于相关子查询,但允许多列:

SELECT  p.ID, 
        p.Patient,
        p.ProcedureType,
        p.ProcedureDate,
        [LastExamDate] = exam.ProcedureDate, 
        [DaysSinceLastExam] = DATEDIFF(DAY, exam.ProcedureDate, p.ProcedureDate),
        [LastExamType] = exam.ProcedureType 
FROM    Procedures p
        OUTER APPLY
        (   SELECT  TOP 1 exams.ProcedureType, exams.ProcedureDate
            FROM    Procedures exams
            WHERE   Exams.ProcedureType LIKE '%Exam%'
            AND     Exams.Patient = p.Patient
            AND     Exams.ProcedureDate <= p.ProcedureDate
            ORDER BY Exams.ProcedureDate DESC
        ) exam;

<强> Example On SQL Fiddle

关于sql - 获取行中日期值之前的最新日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14895910/

相关文章:

sql-server-2008 - 我的 Entity Framework 生成的 SQL 是否执行了两次?

sql - 计算一个表中两个日期之间差异的TSQL问题

SQL 服务器 : delete where string value contains another value

java - SQL Server Nvarchar 和 Java 准备语句

asp.net - 我有多个用户,我可以锁定网页以便一次只有一个用户可以更新记录吗?

php - 如何在 PHP 中列出来自 MySQL 的规范化数据?

sql-server - 在存储过程中添加一列

c# - 使用 Entity Framework 如何在没有大量查询结果集或数百个小查询的情况下创建嵌套对象?

mysql - MySQL数据库中如何按时差去除重复项

sql - 如何使用adodb编写sql查询来选择长度超过255个字符的数据