Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Échantillonnage aléatoire à partir d'un grand ensemble de données

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:J'avais posté une autre question similaire à celle-ci dans laquelle j'ai trouvé que mes résultats n'étaient en fait pas aléatoires, mais qu'ils n'étaient que les résultats TOP N. J'avais commandé par newid() dans la requête la plus externe et tout ce qui se passait était de mélanger exactement le même ensemble de résultats. À partir d'une question qui est maintenant fermée, j'ai découvert que je devais utiliser le TOP mot-clé avec order by newid() dans la ligne commentée de la requête ci-dessus.