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
Libérer: 2024-12-23 06:34:47
original
681 Les gens l'ont consulté

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
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal