SQL:从另一个表中获取用户信息及其最新日期记录
我有两张桌子 患者:患者id、姓名、年龄 & 医疗记录:id,p_id,日期 我需要从患者中选择所有患者以及他们最新医疗记录的日期。 预期的结果是 p、 身份证 名称 年龄 最新 1. 约翰 20 2020/12/20 2. 英雄 18 2020/12/18SQL:从另一个表中获取用户信息及其最新日期记录,sql,Sql,我有两张桌子 患者:患者id、姓名、年龄 & 医疗记录:id,p_id,日期 我需要从患者中选择所有患者以及他们最新医疗记录的日期。 预期的结果是 p、 身份证 名称 年龄 最新 1. 约翰 20 2020/12/20 2. 英雄 18 2020/12/18 传统的方法是使用连接: 选择p.*,先生* 来自患者p 左连接 选择mr1* 来自MedicalRecord mr1 内连接 选择p_id,MAXdate作为max_date 来自MedicalRecord 按p_id分组 mr2 在mr2
传统的方法是使用连接: 选择p.*,先生* 来自患者p 左连接 选择mr1* 来自MedicalRecord mr1 内连接 选择p_id,MAXdate作为max_date 来自MedicalRecord 按p_id分组 mr2 在mr2.p_id=mr1.p_id上 mr2.max_date=mr1.date 先生 关于mr.p_id=p.id 对于分析函数,我们可以在这里使用ROW_NUMBER来获得更简洁的代码: 以cte为例 选择p.*,mr.*,按p.id按mr.date DESC rn排序的分区上的行号 来自患者p 左加入MedicalRecord mr ON mr.p_id=p.id 挑选* 来自cte 其中rn=1;
您可以使用标准sql分析函数row_number,如下所示:
Select * from
(SELECT P.*, row_number() over (partition by p.id order by mr.date desc) as rn
FROM Patient P
JOIN MedicalRecord mr ON mr.p_id = p.id) t
Where rn = 1
SELECT P.*
FROM Patient P
JOIN MedicalRecord mr ON mr.p_id = p.id
WHERE NOT EXISTS
(select 1 from MedicalRecord mr1
Where mr1.p_id = mr.p_id
And mr1.date > mr.date)
您还可以按如下方式使用“不存在”:
Select * from
(SELECT P.*, row_number() over (partition by p.id order by mr.date desc) as rn
FROM Patient P
JOIN MedicalRecord mr ON mr.p_id = p.id) t
Where rn = 1
SELECT P.*
FROM Patient P
JOIN MedicalRecord mr ON mr.p_id = p.id
WHERE NOT EXISTS
(select 1 from MedicalRecord mr1
Where mr1.p_id = mr.p_id
And mr1.date > mr.date)
试试这个:
SELECT *
FROM Patient
JOIN (SELECT
MedicalRecord.p_id,
max(MedicalRecord.date) [date(latest)]
FROM MedicalRecord
group by MedicalRecord.p_id
) x ON Patient.p_id = x.p_id
你好,谢谢你的回答。使用传统的方式,即使患者没有记录,我如何向他们展示?抱歉,我忘了在问题中提到它。@Sciryl将内部联接替换为左联接,它应该可以工作。用您正在使用的数据库标记您的问题。