Select 给定专科医生的最后一次预约和转诊

Select last appointment for a given specialist and a referral leading to it

为了简单起见,我们假设有问题的 table 称为 app,它只有三个字段:

Person_id | employee_id | appointment_time
----------+-------------+-----------------
int       | int         | date

table 包含所有客户 (person_id) 和专家 (employee_id) 过去和未来的所有医疗预约的详细信息。

我想弄清楚的是如何为给定的专家(假设 id 为 235)及其相应的 "referals"(如果有)创建约会列表 - 之前的约会给定的 person_id 日期较早,由另一位专家提供服务 (id <> 235)。

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;

我失败的尝试几乎成功了,但遗憾的是,当预约了一位 id<>235 的专家,其日期晚于 id=235 的最后一次预约时,它的表情就很困惑。现在,我 运行 对这个查询的结果进行了另一个查询,以过滤掉不需要的记录,但这是一个相当丑陋的问题。我确信有更好、更优雅的方法来解决它。请帮忙!

我认为您基本上想要 lag(),但是 SQL Server 2008 中没有(是时候升级到受支持的软件了!)。

您可以使用 apply 代替:

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