2017-10-03 5 views
1

Cette question a trait à la formulation d'une requête dans PostgreSQL Supposons que je le tableau suivant:Comment sélectionner toutes les lignes de groupes n aléatoires dans Postgres

record entity docid sentencid 
1 A 123 1231 
1 A 123 1232 
1 A 100 1001 
1 C 100 1002 
1 B 121 1212 
1 B 123 1234 
2 B 102 1021 
2 D 111 1111 
2 D 102 1022 
2 E 101 1011 
3 C 111 1115 
3 C 111 1113 
3 C 111 1114 

Y at-il une requête PostgresSQL que je peux utiliser pour sélectionner tous lignes pour n (ou moins) groupes aléatoires d'entités pour chaque enregistrement dans cette table? Disons que n est 2. Donc la requête doit sélectionner toutes les lignes pour l'enregistrement 3 et toutes les lignes pour 2 groupes d'entités aléatoires de l'enregistrement 1 et 2. Le résultat final doit être commandé par accession, entity, docid, sentenceid.

Voici un exemple de résultat avec n = 2:

record entity docid sentencid 
1 A 100 1001 
1 A 123 1231 
1 A 123 1232 
1 B 121 1212 
1 B 123 1234 
2 D 102 1022 
2 D 111 1111 
2 E 101 1011 
3 C 111 1113 
3 C 111 1114 
3 C 111 1115 

supposer que les entités A et B ont été choisis au hasard parmi l'ensemble des entités (A, B, C) pour fiche 1 et les entités D et E ont été choisis au hasard parmi l'ensemble des entités (B, D, E) pour l'enregistrement 2. Les n entités doivent être sélectionnées de façon aléatoire pour chaque enregistrement.

J'ai cherché intensivement pour les réponses à cette question mais n'ai trouvé aucune question fonctionnante. Merci d'avoir regardé ça!

+0

Pouvez-vous poster le résultat attendu pour 'n = 2' –

+0

J'ai fourni un résultat acceptable pour n = 2. S'il vous plaît laissez-moi savoir si vous avez d'autres questions. Merci! – ltt

Répondre

1

Vous pouvez utiliser row_number avec un random() afin de sélectionner aléatoirement n entités par groupe record. Alors rejoignez ceci à votre table principale

select * from Table1 t1 
join (
    select * from (
     select record, entity, 
      row_number() over (partition by record order by random()) rn 
     from Table1 
     group by record, entity 
    ) t where rn <= 2 
) t2 on t1.record = t2.record and t1.entity = t2.entity 

Demo

+1

Merci pour votre réponse. Cependant 1) J'ai besoin de plus d'une entité par enregistrement. Dans l'exemple ci-dessus, j'ai montré 2 entités par enregistrement. J'en aurais peut-être besoin de plus de 2, mais le nombre restera constant. 2) Je ne veux pas exclure explicitement l'enregistrement 3 en utilisant 'where record <= 2'. J'ai donné un exemple de tableau ci-dessus pour une question plus générale. L'enregistrement 3 n'aura pas nécessairement un seul type d'entité dans chaque cas. – ltt

+0

Merci pour la clarification. Voir la mise à jour – FuzzyTree

+1

Merci beaucoup! Cela fonctionne: D et a un sens aussi. Votre explication détaillée ainsi que la démo m'ont aidé à comprendre la requête et à la tester rapidement. J'ai essayé d'upvoting votre réponse mais ma réputation n'est pas assez élevée pour le faire encore. – ltt