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