Sql 选择指定专家的最后一次预约以及导致该预约的转诊

Sql 选择指定专家的最后一次预约以及导致该预约的转诊,sql,sql-server-2008,Sql,Sql Server 2008,为了简单起见,我们假设所讨论的表名为app,它只有三个字段: Person_id | employee_id | appointment_time ----------+-------------+----------------- int | int | date 该表包含所有客户人员id和专家员工id的所有医疗预约的详细信息,包括过去和未来 我想弄明白的是如何为给定的专家创建一个预约列表,比如说id为235的预约以及他们相应的推荐(如果有的话)——给定的人员id

为了简单起见,我们假设所讨论的表名为app,它只有三个字段:

Person_id | employee_id | appointment_time
----------+-------------+-----------------
int       | int         | date
该表包含所有客户人员id和专家员工id的所有医疗预约的详细信息,包括过去和未来

我想弄明白的是如何为给定的专家创建一个预约列表,比如说id为235的预约以及他们相应的推荐(如果有的话)——给定的人员id的先前预约,日期较早,由另一个id为235的专家提供服务


我的尝试几乎成功了,但不幸的是,当一位id为235的专家的预约日期比id=235的最后一次预约日期晚时,我的困惑脸上掉了下来。现在,我对这个查询的结果运行另一个查询,以过滤掉不需要的记录,但这是一个相当丑陋的混乱。我相信有更好更优雅的方法来解决这个问题。救命啊

我认为您基本上想要lag,但在SQL Server 2008升级到受支持的软件时,这是不可用的

您可以改为使用“应用”:


请提供样品数据和所需结果。谢谢先生。优雅朴素。非常感谢。
SELECT
  qLast.person_id,
  qLast.employee_id,
  qLast.LastDate,
  qPrevious.employee_id,
  qPrevious.PreviousDate
FROM
  (
    SELECT
      app.person_id,
      app.employee_id,
      Max(app.appointment_time) AS LastDate
    FROM
      app
    GROUP BY
      app.person_id,
      app.employee_id
    HAVING
      app.person_id <> 0
      AND app.employee_id = 235
  ) qLast
  LEFT JOIN (
    SELECT
      qSub.person_id,
      app.employee_id,
      qSub.MaxOfappointment_time AS PreviousDate
    FROM
      (
        SELECT
          app.person_id,
          Max(app.appointment_time) AS MaxOfappointment_time
        FROM
          app
        GROUP BY
          app.person_id,
          app.employee_id
        HAVING
          app.person_id <> 0
          AND app.employee_id <> 235
      ) qSub
      INNER JOIN app ON (
        qSub.MaxOfappointment_time = app.appointment_time
      )
      AND (qSub.person_id = app.person_id)
  ) qPrevious ON qLast.person_id = qPrevious.person_id;
select a.*, a2.*
from app a cross apply
     (select top (1) a2.*
      from app a2
      where a2.person_id = a.person_id and
            a2.employee_id <> a.employee_id and
            a2.appointment_time < a.appointment_time
      order by a2.appointment_time desc
     ) a2