1

次の内容を含む VISITS というテーブルがあるとします。

  • VISIT_DATE (タイムスタンプ)
  • 高さ (数値)
  • ウエスト(数値)
  • 重量(数)
  • PATIENT_ID (数字)

    訪問日| 高さ | ウエスト | 重量 | PATIENT_ID

    2012 年 10 月 1 日 | (ヌル) | 96 | 130 | 44123

    2012 年 11 月 1 日 | 1.74 | (ヌル) | 120 | 44123

    2012 年 12 月 1 日 | (ヌル) | (ヌル) | 150 | 44123

必要なのは、各列の最新の値を取得する SQL 選択ステートメントですが、null フィールドを無視するため、必要な出力は次のようになります。

WHERE句は次のようになります

WHERE PATIENT_ID = 44123 ORDER BY VISIT_DATE DESC LIMIT 1

12/01/2012 | 1.74 | 96 | 150 | 44123

選択から得られる出力からわかるように、各フィールドの値が見つかるまで、患者の各行を逆戻りしています。

この質問が明確で可能であることを願っています。検索しましたが、これまでのところ実際の解決策は見つかりませんでした。これは、病院で使用されている医療システムを合理化するために使用され、約 100 のフィールドがあります。必要なものの概念を理解するためのいくつかのフィールドの例。

4

3 に答える 3

3
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
;

これがSQLfiddleの例です

于 2012-08-14T08:20:44.123 に答える
1
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

これがSQLfiddleの例です

于 2012-08-14T06:17:48.187 に答える
1

これを試して:

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 フィドルのデモ

于 2012-08-14T06:00:30.593 に答える