Sql 使用空值连接和最大日期

Sql 使用空值连接和最大日期,sql,subquery,greatest-n-per-group,cognos,cognos-8,Sql,Subquery,Greatest N Per Group,Cognos,Cognos 8,我需要返回存在生命值的患者ID的最新maxdate-它不仅仅是患者ID的最大遭遇日期,还必须具有相应的生命值。我也只希望遇到生命值和日期>='2020-01-01'和生命ID=232268的情况 遭遇enc 病人编号 遭遇战 日期 1. 11 1/4/2020 1. 12 1/15/2020 1. 13 3/6/2020 2. 14 1/12/2020 3. 15 3/16/2020 3. 16 4/19/2020 4. 17 6/2/2020 4. 18 6/12/2020 4. 19 9/1

我需要返回存在生命值的患者ID的最新maxdate-它不仅仅是患者ID的最大遭遇日期,还必须具有相应的生命值。我也只希望遇到生命值和日期>='2020-01-01'和生命ID=232268的情况

遭遇enc

病人编号 遭遇战 日期 1. 11 1/4/2020 1. 12 1/15/2020 1. 13 3/6/2020 2. 14 1/12/2020 3. 15 3/16/2020 3. 16 4/19/2020 4. 17 6/2/2020 4. 18 6/12/2020 4. 19 9/1/2020
如果我没有弄错,您需要相关子查询中的两个表:

select v.encounterid, e.patientid, e.date, v.value, v.vitalid 
from enc e 
inner join vitals v on v.encounterid = e.encounterid 
where 
    v.vitalid = 232268 
    and v.value <>'' 
    and e.date = (
        select max(e1.date) 
        from enc e1
        inner join vitals v1 on v1.encounterid = e1.encounterid 
        where 
            e1.patientid = e.patientid 
            and v1.vitalid = v.vitalid
            and v1.value <> ''
            and e.date >= '2020-01-01'
    )
我不知道Cognos是否支持窗口函数。但如果是这样,查询的措辞可能会简单得多:

select *
from (
    select v.encounterid, e.patientid, e.date, v.value, v.vitalid,
        row_number() over(partition by e.patientid order by e.date)
    from enc e 
    inner join vitals v on v.encounterid = e.encounterid 
    where v.vitalid = 232268 and v.value <> ''
) t
where rn = 1

如果我没有弄错,您需要相关子查询中的两个表:

select v.encounterid, e.patientid, e.date, v.value, v.vitalid 
from enc e 
inner join vitals v on v.encounterid = e.encounterid 
where 
    v.vitalid = 232268 
    and v.value <>'' 
    and e.date = (
        select max(e1.date) 
        from enc e1
        inner join vitals v1 on v1.encounterid = e1.encounterid 
        where 
            e1.patientid = e.patientid 
            and v1.vitalid = v.vitalid
            and v1.value <> ''
            and e.date >= '2020-01-01'
    )
我不知道Cognos是否支持窗口函数。但如果是这样,查询的措辞可能会简单得多:

select *
from (
    select v.encounterid, e.patientid, e.date, v.value, v.vitalid,
        row_number() over(partition by e.patientid order by e.date)
    from enc e 
    inner join vitals v on v.encounterid = e.encounterid 
    where v.vitalid = 232268 and v.value <> ''
) t
where rn = 1