Maison >base de données >tutoriel mysql >Comment puis-je sélectionner aléatoirement une ligne dans un tableau pondéré avec SQL ?

Comment puis-je sélectionner aléatoirement une ligne dans un tableau pondéré avec SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 06:34:47683parcourir

How Can I Randomly Select a Row from a Weighted Table with SQL?

Sélection de lignes aléatoires avec probabilité pondérée

Considérez un tableau avec des champs tels que l'identifiant, le contenu et le poids. Votre objectif est de sélectionner au hasard une seule ligne de ce tableau tout en prenant en compte les poids.

Par exemple, étant donné trois lignes avec les données suivantes :

id, content, weight
1, "some content", 60
2, "other content", 40
3, "something", 100

La distribution de probabilité est la suivante :

  • Rangée 1 : 30%
  • Rangée 2 : 20 %
  • Rangée 3 : 50 %

Échantillonnage pondéré des réservoirs

L'approche la plus simple pour y parvenir consiste à procéder à un échantillonnage pondéré des réservoirs :

SELECT
  id,
  -LOG(RAND()) / weight AS priority
FROM
  your_table
ORDER BY priority
LIMIT 1;

Cette méthode garantit une sélection raisonnable de M éléments parmi une collection de N éléments, où les la probabilité de sélectionner chaque élément est proportionnelle à son poids. Il reste efficace même lorsqu'un seul élément est souhaité.

Le principe sous-jacent de l'échantillonnage pondéré des réservoirs est décrit en détail dans l'article fourni. Notamment, cela implique de sélectionner les plus petites valeurs de -LOG(RAND()) /weight plutôt que les plus grandes valeurs de POW(RAND(), 1/weight) comme décrit dans l'article. Cela donne des résultats équivalents.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn