Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从Oracle中的表中获取每个字段的最新数据_Sql_Oracle - Fatal编程技术网

Sql 从Oracle中的表中获取每个字段的最新数据

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

假设我有一个名为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 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
;