Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Amostragem aleatória de um grande conjunto de dados

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 

EDIT:Eu havia postado outra pergunta semelhante a esta na qual descobri que meus resultados não eram de fato aleatórios, mas eram apenas os resultados TOP N. Eu tinha ordenado por newid() na consulta mais externa e tudo o que estava fazendo era embaralhar exatamente o mesmo conjunto de resultados. A partir de uma pergunta que agora está encerrada, descobri que precisava usar o TOP palavra-chave junto com order by newid() na linha comentada na consulta acima.