3
votes

Comment faire un échantillon aléatoire stratifié dans Redshift?

Je dois prendre un échantillon aléatoire de clients qui ont acheté dans différentes catégories. Il existe 8 catégories, et les commandes sont réparties entre elles.

Si je voulais prendre un échantillon aléatoire de clients qui ont effectué un achat, mais que je conserve la même proportion de commandes par catégorie, comment pourrais-je configurer cela dans mon code SQL?

Un tableau mettant en évidence ceci est ci-dessous (il n'inclut pas les données client - je veux que ma liste de clients soit basée sur la proportion représentative des commandes):

Le tableau

que j'utilise peut être trouvé ici: https://imgur.com/a/Q0lMHWf


3 commentaires

Postgres ou Redshift. Bien qu'ils partagent les mêmes racines, ils sont assez différents.


Postgresql fonctionne sur Redshift!


Je viens de tomber sur cela car j'ai le même problème. Une chance pour le découvrir à la fin?


3 Réponses :


2
votes

En gros, vous utiliseriez row_number () , order by , et choisiriez les nièmes valeurs. Donc, pour un échantillon stratifié d'environ 1%, faites:

select t.*
from (select t.*,
             row_number() over (order by category, rand()) as seqnum
      from t
     ) t
where mod(seqnum, 101) = 1
order by category;

L'idée de base est que vous pouvez obtenir un échantillon stratifié en ordonnant l'ensemble de résultats par catégories et en faisant un nième échantillon du résultat .


3 commentaires

Hey Gordon, voulez-vous dire que je lance cette requête pour chaque catégorie?


Je ne sais pas de quoi vous parlez Gordon. Toute clarification serait appréciée.


@ nz426. . . Non, ce serait une façon idiote d'obtenir un échantillon stratifié. Cette requête obtient un échantillon stratifié d'environ 1%.



1
votes

Essayez un PERCENT_RANK dans un ordre aléatoire pour obtenir un échantillon de n% d'ordres:

select *
from
 (
   select t.*
      ,percent_rank()
       over (partition by category
             order by rand()) as pr
   from tab
 ) as dt
where pr <= 0.1 -- similar to 10% sample


0 commentaires

1
votes

La solution @Dnoeth est efficace et simple d'utilisation. Mais, veuillez changer rand () en random (). Le nom de la fonction aléatoire d'AWS redshift est «aléatoire». Veuillez consulter https://docs.aws.amazon.com/redshift/ dernier / dg / r_RANDOM.html . 'random () fonctionne pour moi mais pas pour rand ()

select *

from
(
 select t.*
  ,percent_rank()
   over (partition by category
         order by random()) as pr
from tab
) as dt 
where pr <= 0.1 -- similar to 10% sample


0 commentaires