1

ロジスティック回帰は、一意に識別される番号と、それに続く人が特定の基準を満たしているかどうかに基づく複数のバイナリ変数 (常に 1 または 0) で構成されます。以下に、これらのバイナリ条件のいくつかをリストするクエリを示します。このような基準が 4 つしかない場合、クエリの実行には、私が考えるよりも少し時間がかかります。以下よりも効率的なアプローチはありますか?ノート。tblicd は、15,000 行以上のテキスト表現を持つ大規模なテーブル ルックアップ テーブルです。クエリは実際には意味がありません。概念の証明にすぎません。複合キーに適切なインデックスがあります。

select  patient.patientid 
,case when exists
(
    select c.patientid from tblclaims as c
    inner join patient as p on p.patientid=c.patientid
    and c.admissiondate = p.admissiondate
    and c.dischargedate = p.dischargedate
    where patient.patientid = p.patientid
    group by c.patientid
    having count(*) > 1000
    )
    then '1' else '0'
    end as moreThan1000
,case when exists
(
    select c.patientid from tblclaims as c
    inner join patient as p on p.patientid=c.patientid
    and c.admissiondate = p.admissiondate
    and c.dischargedate = p.dischargedate
    where patient.patientid = p.patientid
    group by c.patientid
    having count(*) > 1500
    )
    then '1' else '0'
    end as moreThan1500
,case when exists
(
    select distinct picd.patientid from patienticd as picd
    inner join patient as p on p.patientid= picd.patientid
    and picd.admissiondate = p.admissiondate
    and picd.dischargedate = p.dischargedate
    inner join tblicd as t on t.icd_id = picd.icd_id
    where t.descrip like '%diabetes%' and patient.patientid = picd.patientid
    )
    then '1' else '0'
    end as diabetes
,case when exists
(
    select r.patientid, count(*) from patient as r
    where r.patientid = patient.patientid
    group by r.patientid
    having count(*) >1
    ) 
    then '1' else '0'
    end 


from patient
order by moreThan1000 desc
4

2 に答える 2

2

from 句でサブクエリを使用することから始めます。

select q.patientid, moreThan1000, moreThan1500,
       (case when d.patientid is not null then 1 else 0 end),
       (case when pc.patientid is not null then 1 else 0 end)
from patient p left outer join
     (select c.patientid,
             (case when count(*) > 1000 then 1 else 0 end) as moreThan1000,
             (case when count(*) > 1500 then 1 else 0 end) as moreThan1500
      from tblclaims as c inner join
           patient as p
           on p.patientid=c.patientid and
              c.admissiondate = p.admissiondate and
              c.dischargedate = p.dischargedate
      group by c.patientid
     ) q
     on p.patientid = q.patientid left outer join
     (select distinct picd.patientid
      from patienticd as picd inner join
           patient as p
           on p.patientid= picd.patientid and
              picd.admissiondate = p.admissiondate and
              picd.dischargedate = p.dischargedate inner join
          tblicd as t
          on t.icd_id = picd.icd_id
      where t.descrip like '%diabetes%'
     ) d
     on p.patientid = d.patientid left outer join
     (select r.patientid, count(*) as cnt
      from patient as r
      group by r.patientid
      having count(*) >1
     ) pc
     on p.patientid = pc.patientid
order by 2 desc

次に、これらのサブクエリを組み合わせることで、おそらくさらに単純化できます (たとえば、外側のクエリの "p" と "pc" を 1 つに組み合わせることができます)。ただし、相関サブクエリがなければ、SQL Server はクエリの最適化をより簡単に行うことができます。

于 2012-07-24T13:43:27.437 に答える
1

要求された左結合の例...

SELECT
    patientid,
    ISNULL(CondA.ConditionA,0) as IsConditionA,
    ISNULL(CondB.ConditionB,0) as IsConditionB,
    ....
FROM
    patient
        LEFT JOIN
    (SELECT DISTINCT patientid, 1 as ConditionA from ... where ... ) CondA
        ON patient.patientid = CondA.patientID
        LEFT JOIN
    (SELECT DISTINCT patientid, 1 as ConditionB from ... where ... ) CondB
        ON patient.patientid = CondB.patientID

条件クエリが最大 1 行しか返さない場合は、次のように簡略化できます。

    (SELECT patientid, 1 as ConditionA from ... where ... ) CondA
于 2012-07-24T13:52:08.863 に答える