0

特定の基準を満たす人の数、その母集団の合計人数、およびその基準を満たすパーセンテージを取得するためにクエリを実行していることに気付くことがよくあります。私はしばらくの間同じ方法でそれを行ってきました.SOが同じタイプの問題を解決するために何をするのか疑問に思っていました. 以下は、クエリの書き方です。

select m.state_cd
    ,m.injurylevel
    ,COUNT(distinct m.patid) as pplOnRx
    ,x.totalPatientsPerState
    ,round((COUNT(distinct m.patid) /cast(x.totalPatientsPerState as float))*100,2) as percentPrescribedNarcotics
    from members as m
    inner join rx on rx.patid=m.PATID
    inner join DrugTable as dt on dt.drugClass=rx.drugClass
    inner join 
    (
        select m2.state_cd, m2.injurylevel, COUNT(distinct m2.patid) as totalPatientsPerState
            from members as m2
            inner join rx on rx.patid=m2.PATID
            group by m2.STATE_CD,m2.injuryLevel
    ) x on x.state_cd=m.state_cd and m.injuryLevel=x.injurylevel
    where drugText like '%narcotics%'
    group by m.state_cd,m.injurylevel,x.totalPatientsPerState
    order by m.STATE_CD,m.injuryLevel

この例では、membersテーブルに表示されるすべての人がテーブルにいるわけではありませんrx。派生テーブルは、 の条件なしrxでも にいるすべての人を確認します。私が少し遊んだことから、この句はここで機能するようです。そうなのかどうかはわかりませんが、私にはそう思われます。他の誰かがこの問題にどのように取り組むでしょうか?membersdrugText like narcoticsover(partition by

結果:

ここに画像の説明を入力

4

1 に答える 1

2

これはまさに、MDX と SSAS が行うように設計されていることです。SQL でそれを行うことを主張する場合 (それは何も悪いことではありません)、より良いパフォーマンスでそれを行う方法を求めていますか? その場合、テーブルがどのようにインデックス化されているか、tempdb の速度、およびテーブルがパーティション分割されているかどうかによって異なります。

また、個別のカウントは、より大きなパフォーマンス ヒットの 1 つになります。述語のlike '%narcotics%'は、完全なテーブル スキャンを強制するため、絶対に避ける必要があります (これはデータ モデルの整数キーになる可能性がありますか?)。

あなたの質問に答えるために、ウィンドウ処理 ( over partition by) のパフォーマンスが向上するかどうかはよくわかりません。テストして確認しますが、クエリに「問題」はありません。

個別のカウントを仮想テーブルまたは一時テーブルとして、group by またはこれら 2 つの組み合わせで書き直すことができます。

説明のために、これは同じクエリに拡張できるウィンドウ処理のスタブです。

select a.state_cd,a.injurylevel,a.totalpatid, count(*) over (partition by a.state_cd, a.injurylevel)
from
(select state_cd,injurylevel,count(*) as totalpatid, count(distinct patid) as patid 
from
#members
group by state_cd,injurylevel
)  a

本当に役に立たないというのが何を意味するかわかりますか?繰り返しますが、クエリを少し書き直すと、より良い実行計画を選択することでパフォーマンスが向上することがありますが、暗闇で突き刺すのではなく、クエリのボトルネックを最初に見つけます。

于 2012-11-12T08:01:09.913 に答える