Sql 从Oracle中的表中获取每个字段的最新数据
假设我有一个名为visions的表,其中包含以下内容 访问日期时间戳 高度数 腰数 权重数 病人身份证号码 就诊日期|身高|腰围|体重|患者ID 2012年1月10日|空| 96 | 130 | 44123 2012年1月11日| 1.74 |空| 120 | 44123 2012年1月12日|零|零| 150 | 44123 我需要的是一个sql select语句来获取每个列的最新值,但忽略空字段,这样我需要的输出将是 WHERE子句应该是Sql 从Oracle中的表中获取每个字段的最新数据,sql,oracle,Sql,Oracle,假设我有一个名为visions的表,其中包含以下内容 访问日期时间戳 高度数 腰数 权重数 病人身份证号码 就诊日期|身高|腰围|体重|患者ID 2012年1月10日|空| 96 | 130 | 44123 2012年1月11日| 1.74 |空| 120 | 44123 2012年1月12日|零|零| 150 | 44123 我需要的是一个sql select语句来获取每个列的最新值,但忽略空字段,这样我需要的输出将是 WHERE子句应该是 WHERE PATIENT_ID = 44123 O
WHERE PATIENT_ID = 44123 ORDER BY VISIT_DATE DESC LIMIT 1
正如您可以从我期望从select中获得的输出中看到的,我正在向后遍历患者的每一行,直到找到每个字段的值
我希望这个问题是明确的和可能的,我已经搜索过了,但到目前为止还没有找到任何真正的解决方案,这将用于简化医院使用的医疗系统,大约有100个领域。以上只是几个领域的一个例子,以了解所需内容的概念。尝试一下:
select a.PATIENT_ID,a.VISIT_DATE,b.HEIGHT,c.WEIGHT,d.WAIST
from
(select PATIENT_ID,
max(VISIT_DATE) as VISIT_DATE
from VISITS
group by PATIENT_ID)a
join
(select PATIENT_ID,HEIGHT from (select PATIENT_ID,HEIGHT
from VISITS v
order by case when v.HEIGHT is null
then to_date('1900/01/01','YYYY/MM/DD')
else v.VISIT_DATE end desc) where rownum=1)b
on a.PATIENT_ID=b.PATIENT_ID
join
(select PATIENT_ID,WEIGHT from (select PATIENT_ID,WEIGHT
from VISITS v
order by case when v.WEIGHT is null
then to_date('1900/01/01','YYYY/MM/DD')
else v.VISIT_DATE end desc) where rownum=1)c
on a.PATIENT_ID=c.PATIENT_ID
join
(select PATIENT_ID,WAIST from (select PATIENT_ID,WAIST
from VISITS v
order by case when v.WAIST is null
then to_date('1900/01/01','YYYY/MM/DD')
else v.VISIT_DATE end desc) where rownum=1)d
on a.PATIENT_ID=d.PATIENT_ID
SQL FIDLE尝试以下方法:
select a.PATIENT_ID,a.VISIT_DATE,b.HEIGHT,c.WEIGHT,d.WAIST
from
(select PATIENT_ID,
max(VISIT_DATE) as VISIT_DATE
from VISITS
group by PATIENT_ID)a
join
(select PATIENT_ID,HEIGHT from (select PATIENT_ID,HEIGHT
from VISITS v
order by case when v.HEIGHT is null
then to_date('1900/01/01','YYYY/MM/DD')
else v.VISIT_DATE end desc) where rownum=1)b
on a.PATIENT_ID=b.PATIENT_ID
join
(select PATIENT_ID,WEIGHT from (select PATIENT_ID,WEIGHT
from VISITS v
order by case when v.WEIGHT is null
then to_date('1900/01/01','YYYY/MM/DD')
else v.VISIT_DATE end desc) where rownum=1)c
on a.PATIENT_ID=c.PATIENT_ID
join
(select PATIENT_ID,WAIST from (select PATIENT_ID,WAIST
from VISITS v
order by case when v.WAIST is null
then to_date('1900/01/01','YYYY/MM/DD')
else v.VISIT_DATE end desc) where rownum=1)d
on a.PATIENT_ID=d.PATIENT_ID
SQL小提琴
这是
这是
这是
这是一个不好的设计,很难维护!如果你想保存病史-在另一个表格中保存,但每个患者只保留一个记录并分别更新-这将使你的生活更加轻松!这不是一个好的设计,维护起来会很困难!如果你想保存病史-在另一个表格中保存,但每个患者只保留一个记录并分别更新-这将使你的生活更加轻松!我猜只有当患者体重总是增加时,这个查询才会输出正确的结果:在oracle中,ROWNUM是在order by之前分配的,所以子查询中的条件ROWNUM=1没有意义。要在oracle中获得TOP 1,应使用select和嵌套子查询@谢谢你的评论。。我已更新我的查询..请立即检查仍然不正确。此查询适用于表中的一个患者ID。如果我们有很多可怜虫怎么办。您在JOIN中的子查询从所有表中选择TOP 1,而不考虑患者ID,然后与患者ID上的主表联接。我猜只有当患者总是增加体重时,此查询才会输出正确的结果:在oracle中,ROWNUM是在order by之前分配的,因此子查询中的ROWNUM=1的条件没有意义。要在oracle中获得TOP 1,应使用select和嵌套子查询@谢谢你的评论。。我已更新我的查询..请立即检查仍然不正确。此查询适用于表中的一个患者ID。如果我们有很多可怜虫怎么办。您在JOIN中的子查询从所有表中选择TOP 1,而不考虑患者ID,然后在患者ID上与主表联接。如果两个不同的记录具有相同的就诊日期,会发生什么情况?它在讨论subselect返回的行数时抛出错误。@AmirPashazadeh:刚刚修复。如果在Visits表中可以出现这种情况,我刚才在所有子查询中添加了MAX来处理这种情况。如果两个不同的记录具有相同的访问日期,会发生什么情况?它在讨论subselect返回的行数时抛出错误。@AmirPashazadeh:刚刚修复。如果这种情况在访问表中是可能的,我只是在所有子查询中添加了MAX来处理这种情况。哇,你的绝对明星,它工作得非常好,非常感谢你,你的绝对明星,它工作得非常好,非常感谢
select visits2.patient_id,visits2.maxDate,
( select max(HEIGHT) from visits where visit_Date=
(select max(visit_date) m from visits l
where (HEIGHT is not null)
and
(l.patient_id=visits2.patient_id)
)
and
(patient_id=visits2.patient_id)
) HEIGHT,
( select max(WAIST) from visits where visit_Date=
(select max(visit_date) m from visits l
where (WAIST is not null)
and
(l.patient_id=visits2.patient_id)
)
and
(patient_id=visits2.patient_id)
) WAIST,
( select max(WEIGHT) from visits where visit_Date=
(select max(visit_date) m from visits l
where (WEIGHT is not null)
and
(l.patient_id=visits2.patient_id)
)
and
(patient_id=visits2.patient_id)
) WEIGHT
from
(select patient_id,max(visit_date) maxDate
from visits group by patient_id) visits2
create table VISITS
(
VISIT_DATE TIMESTAMP
, HEIGHT NUMBER
, WAIST NUMBER
, WEIGHT NUMBER
, PATIENT_ID NUMBER
);
insert into visits values(systimestamp, null, 96, 130, 44123);
insert into visits values(systimestamp, 1.74, NULL, 120, 44123);
insert into visits values(systimestamp, null, NULL, 150, 44123);
select
last_visit_date
, height
, waist
, weight
, patient_id
from
(
select
first_value( VISIT_DATE) over( partition by patient_id order by visit_date desc) last_visit_date
, first_value( HEIGHT ignore nulls) over( partition by patient_id order by visit_date desc) height
, first_value( WAIST ignore nulls) over( partition by patient_id order by visit_date desc) WAIST
, first_value( WEIGHT ignore nulls) over( partition by patient_id order by visit_date desc) WEIGHT
, min(visit_date) over( partition by patient_id) min_visit_date
, visit_date
, patient_id
from visits
)
where
min_visit_date = visit_date
and patient_id = 44123
;