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
为了简单起见,我们假设有问题的 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