sql >> Base de Datos >  >> RDS >> Sqlserver

Muestreo aleatorio de un gran conjunto de datos

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 

EDITAR:publiqué otra pregunta similar a esta en la que descubrí que mis resultados no eran aleatorios, sino que solo eran los resultados TOP N. Había pedido por newid() en la consulta más externa y todo lo que estaba haciendo era mezclar exactamente el mismo conjunto de resultados. De una pregunta que ahora está cerrada, descubrí que necesitaba usar el TOP palabra clave junto con order by newid() en la línea comentada en la consulta anterior.