0

mssql < 2005

我有一个包含很多表的复杂数据库,但现在只有患者表和测量表很重要。

我需要的是最新值'code'与某个值匹配的患者人数。此外,datemeasurement 必须在“2012-04-01”之后。我用两种不同的方式解决了这个问题:

SELECT
COUNT(P.patid)
FROM T_Patients P
WHERE P.patid IN (SELECT patid
                        FROM T_Measurements M WHERE (M.code ='xxxx'  AND result= 'xx')  
                AND datemeasurement = 
                    (SELECT MAX(datemeasurement) FROM T_Measurements 
                     WHERE datemeasurement > '2012-01-04' AND patid = M.patid
                     GROUP BY patid
                        GROUP by patid)

和:

SELECT
            COUNT(P.patid)
            FROM T_Patient P


WHERE 1 = (SELECT TOP 1 case when result = 'xx' then 1 else 0 end 
        FROM T_Measurements M 
    WHERE (M.code ='xxxx')  AND datemeasurement > '2012-01-04' AND patid = P.patid
    ORDER by datemeasurement DESC
)

这工作得很好,但它使查询非常慢,因为它必须在子查询上加入外部表(如果你知道我的意思)。查询需要 10 秒而不进行最近一次检查,而需要 3 分钟进行最近一次检查。

我很确定这可以做得更有效率,所以如果你愿意,请赐教:)。

我尝试实施HAVING datemeasurment=MAX(datemeasurement),但不断向我抛出错误。

4

2 回答 2

1

所以我的方法是编写一个查询,获取自 2012 年 1 月 4 日以来所有最后的患者结果,然后为您的代码和结果过滤它。所以像

select 
    count(1) 
from
    T_Measurements M 
    inner join (
            SELECT PATID, MAX(datemeasurement) as lastMeasuredDate from
            T_Measurements M
            where datemeasurement > '01-04-2012'
            group by patID
            ) lastMeasurements 
    on lastMeasurements.lastmeasuredDate = M.datemeasurement
       and lastMeasurements.PatID = M.PatID
where
    M.Code = 'Xxxx' and M.result = 'XX'
于 2013-03-04T17:28:07.997 回答
1

最快的方法可能是使用row_number()

SELECT COUNT(m.patid)
from (select m.*,
             ROW_NUMBER() over (partition by patid order by datemeasurement desc) as seqnum
      FROM T_Measurements m
      where datemeasurement > '2012-01-04'
     ) m
where seqnum = 1 and code = 'XXX' and result = 'xx'

Row_number()枚举每个患者的记录,因此最近的获得值 1。结果只是一个选择。

于 2013-03-04T17:38:50.203 回答