1

私は一生ここで何が欠けているのかわかりませんが、最初のクエリが私が望むことをしない理由を誰かが私に指摘できますが、2番目のクエリは正常に機能しますか?クエリが完全に同じではないことは知っていますが、同じ20行を返す必要がありますが、そうではありません。(クエリ入力は、単一のテーブルで最も一般的な上位20項目を検索します)

    select distinct
             rx.drug_class
        from rx
        where exists
        (
            select top 20    
                     rx2.drug_class
                    ,COUNT(distinct rx2.pat_id) as counts
                    ,RANK() over(order by count(distinct pat_id) desc) as rn
                    from rx as rx2
                    --when the line below is commented out 
                    --this subquery gives the correct answer
                    where rx.drug_class = rx2.drug_class
                    group by rx2.drug_class
        )

これは問題なく動作します

select distinct 
        rx.drug_class
        from rx
        where rx.drug_class in 
        (
            select top 20 rx.drug_class
                from rx
                group by rx.drug_class
                order by COUNT(distinct pat_id) desc 
        )

Existsサブクエリのwhere句が機能していませんが、何が得られますか?

4

2 に答える 2

5

最初のクエリに行番号を割り当てている場合でも、次の行番号を割り当てる必要がありますORDER BY

where rx.drug_class = rx2.drug_class
group by rx2.drug_class
order by rn

また、以下も同様に機能するため、これは単純化された例であると想定しています。

select top 20 rx.drug_class
from rx
group by rx.drug_class
order by COUNT(distinct pat_id) desc

編集:

カウントを実行する前に、セットEXISTSを内側の行と外側のセットの行に一致するように制限しているため、も機能しません...その場合、行は常にカウントに存在します。SELECTtop 20

すべてのIN行に対して1セットのカウントであるため、機能します...EXISTS外側のセットの個々の行ごとにカウントが行われているため失敗します...したがって、外側のセットのすべての行は、これらのカウント時に上位20カウントに含まれます。外側の行のみに制限されdrug_classます。

于 2013-03-26T18:17:54.643 に答える
1

私の知る限り、EXISTS句はTRUEまたはFALSEを返します。したがって、サブクエリから20行が存在する場合、それはTRUEINを意味し、句のようなフィルターではありません。

于 2013-03-26T18:26:48.523 に答える