Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Campionamento casuale da un set di dati di grandi dimensioni

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:avevo postato un'altra domanda simile a questa in cui ho scoperto che i miei risultati non erano in realtà casuali, ma erano solo i primi N risultati. Avevo ordinato da newid() nella query più esterna e tutto ciò che stava facendo era rimescolare lo stesso identico set di risultati. Da una domanda che ora è chiusa, ho scoperto che dovevo usare il TOP parola chiave insieme a order by newid() nella riga commentata nella query precedente.