5

私が研究母集団を抽出した大規模なデータベースがあります。比較のために、同様の特性を持つコントロールグループを選択したいと思います。私が一致させたいものの2つの基準は、年齢と性別です。マッチングの目的で必要な番号を教えてくれるクエリは次のとおりです。

select sex, age/10 as decades,COUNT(*) as counts
        from
        (
            select distinct m.patid
                ,m.sex,DATEPART(year,min(c.admitdate)) -m.yrdob as Age
                from members as m
                inner join claims as c on c.patid=m.PATID
                group by m.PATID, m.sex,m.yrdob
        )x group by sex, Age/10

次のような結果セット

ここに画像の説明を入力してください

この時代の数十年の列は、次の式で与えられます。

(DATEPART(year,min(c.admitdate)) -m.yrdob)/10 

これは、整数除算を使用して20〜29歳、30〜39歳などの年齢範囲の人々を見つけるために使用されます。より大きなデータセットから、たとえば、20代の507人の女性を選択したいと思います。より大きなデータセットの特性を見つけるためのクエリは次のとおりです。

select distinct m.patid
        ,m.sex
        ,(DATEPART(year,min(c.admitdate)) -m.yrdob)/10 as decades
        from members as m
        inner join claims as c on c.patid=m.PATID
        group by m.PATID, m.sex,m.yrdob

編集:2番目のクエリの結果 ここに画像の説明を入力してください

したがって、最初のクエリでsum等しくなるように、2番目のクエリの数十年の列が必要です。counts私が試した(そしてゼロの結果を返した)ことは以下の通りです。これらの年齢に合わせるために何をする必要がありますか?

実行されるが結果を返さないクエリ:

select x.PATID--,x.sex,x.decades,y.counts
    from
    (

    select distinct m.patid
        ,m.sex
        ,(DATEPART(year,min(c.admitdate)) -m.yrdob)/10 as decades
        from members as m
        inner join claims as c on c.patid=m.PATID
        group by m.PATID, m.sex,m.yrdob
    ) as x 
    inner join 
    (

        select sex, age/10 as decades,COUNT(*) as counts
        from
        (
            select distinct m.patid
                ,m.sex,DATEPART(year,min(c.admitdate)) -m.yrdob as Age
                from members as m
                inner join claims as c on c.patid=m.PATID
                group by m.PATID, m.sex,m.yrdob
        )x group by sex, Age/10
    ) as y on x.sex=y.sex and x.decades=y.decades
    group by y.counts,x.PATID,x.sex,y.sex
    having SUM(x.decades)=y.counts and x.sex=y.sex
4

1 に答える 1

1
select
   T1.sex,
   T1.decades,
   T1.counts,
   T2.patid

from (

   select 
      sex, 
      age/10 as decades,
      COUNT(*) as counts
   from (

      select  m.patid,
         m.sex,
         DATEPART(year,min(c.admitdate)) -m.yrdob as Age
      from members as m
      inner join claims as c on c.patid=m.PATID
      group by m.PATID, m.sex,m.yrdob
   )x 
   group by sex, Age/10
) as T1
join (
   --right here is where the random sampling occurs
    SELECT TOP 50--this is the total number of peolpe in our dataset
      patid
      ,sex
      ,decades

   from (
      select  m.patid,
         m.sex,
         (DATEPART(year,min(c.admitdate)) -m.yrdob)/10 as decades
      from members as m
      inner join claims as c on c.patid=m.PATID
      group by m.PATID, m.sex, m.yrdob

   ) T2
      order by NEWID()
) as T2
on T2.sex = T1.sex
and T2.decades = T1.decades 

編集:私はこれに似た別の質問を投稿しましたが、私の結果は実際にはランダムではないことがわかりましたが、それらはトップNの結果にすぎませんでした。私はnewid()最も外側のクエリで注文しましたが、それはまったく同じ結果セットをシャッフルすることだけでした。現在閉じられている質問から、上記のクエリのコメント行でTOPキーワードと一緒に使用する必要があることがわかりました。order by newid()

于 2012-11-29T15:41:53.490 に答える