2

個人に関する一連の情報と、dxcodes のグループが存在したことがあるかどうかを表示するクエリがあります。各列は、同じテーブル内の別のグループの dxcode に対する異なるチェックです。

出力例:

pid . . . .HTN . . .DM  
123 . . . Y . . . . .N  
456 . . . N . . . . .N  

クエリ:

select  
    p.pid
    ,CASE WHEN HTN.pid is not null THEN 'Y' ELSE 'N' END AS HTN   
    ,... (other case statements)
from p

left outer join (  
    SELECT dx.pid, max(create_timestamp) as maxdate  
    FROM pdx  
    WHERE pdx.dxcode IN ('401','401.0','401.1','401.9')  
    group by dx.pid  
    ) as HTN on p.pid = HTN.pid

...同じ pdx テーブルで他の結合を行い、他の dx コードの存在を照会します

私のクエリは機能しますが、可能な限り効率的ではないと思います。maxdate は本当に必要ありませんが、うまくいきました。これより前は、個別の人物を選択して使用していましたが、後処理がどれだけ必要かを認識し、クエリのパフォーマンスはすでに劇的に向上しています。ベスト プラクティスとして、max を使用して 1 つの結果のみを返す追加の計算は、依然として不必要な計算だと思います。

私は同じことをするためにexists、left joins、top 1 1、およびcaseステートメントのバリエーションを使用しようとしましたが、コードを適切に実行していません.

ありがとう。これは簡単な答えでなければならないことはわかっています。私が探していた用語は、私が望んでいた答えをもたらしませんでした.

4

2 に答える 2

1

おそらく、CASE ステートメントを WHEN HTN.pid IS NOT NULL THEN 1 ELSE 0 END のようなものに変更し、各ケースを合計してから、最後の SELECT を全体にラップしますか? 次に、たとえば、HTN > 0 の場合 THEN Y ELSE N?

select
    pid,
    case when HTN > 0 then 'Y' else 'N' end AS 'HTN',
    case when DM > 0 then 'Y' else 'N' end AS 'DM',
    case when CBG > 0 then 'Y' else 'N' end AS 'CBG',
    case when XYZ > 0 then 'Y' else 'N' end AS 'XYZ',
    case when DB > 0 then 'Y' else 'N' end AS 'DB'
from (  
        select
            p.pid,
            sum(case when pdx.dxcode in ('409', '409.1', '409.3') then 1 else 0 end) as 'HTN',
            sum(case when pdx.dxcode in ('899', '899.1', '892.2') then 1 else 0 end) as 'DM',
            sum(case when pdx.dxcode in ('410.0', '419.1', '419.3') then 1 else 0 end) as 'CBG',
            sum(case when pdx.dxcode in ('250', '250.1', '250.3') then 1 else 0 end) as 'XYZ',
            sum(case when pdx.dxcode in ('58.0', '58.1', '58.3') then 1 else 0 end) as 'DB'
        from
            person p left join
            pdx on
                p.pid = pdx.pid
        group by p.pid
    ) as dx
于 2013-08-01T17:04:37.293 に答える