0

Mssql < 2005

多くのテーブルを含む複雑なデータベースがありますが、今のところ、患者テーブルと測定値テーブルだけが重要です。

必要なのは、 の最新の値が'code'特定の値に一致する患者の数です。また、datemeasurement は '2012-04-01' 以降である必要があります。これを 2 つの異なる方法で修正しました。

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

最速の方法は、次を使用すること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 に答える
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 に答える