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

Comment puis-je sélectionner aléatoirement une ligne dans un tableau avec une probabilité pondérée à l'aide de SQL ?

Linda Hamilton
Libérer: 2024-12-26 06:55:15
original
494 Les gens l'ont consulté

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

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

Considérant un tableau avec l'identifiant, le contenu et le poids des colonnes, la tâche consiste à sélectionner au hasard une ligne tout en tenant compte du poids. Dans un scénario où il existe trois lignes avec des pondérations de 60, 40 et 100, respectivement, le défi consiste à calculer la probabilité de sélectionner chaque ligne comme suit :

  • Ligne 1 : 30 % de chance
  • Rangée 2 : 20 % de chances
  • Rangée 3 : 50 % hasard

Échantillonnage pondéré de réservoir

L'approche optimale pour ce problème est l'échantillonnage pondéré de réservoir, qui peut sélectionner efficacement des éléments avec des probabilités proportionnelles à leur poids. Voici comment l'appliquer :

SELECT
  id,
  -LOG(RAND()) / weight AS priority
FROM
  your_table
ORDER BY priority
LIMIT 1;
Copier après la connexion

Cette requête SQL utilise la logique suivante :

  • Elle associe chaque ligne à sa priorité, calculée comme le logarithme négatif d'un nombre aléatoire divisé par le poids de la ligne.
  • Le tri des lignes par priorité garantit que les lignes avec des poids plus élevés ont plus de chances d'apparaître en haut du résultat set.
  • Limiter le résultat à une seule ligne donne la ligne choisie au hasard avec une probabilité pondérée.

Cette technique d'échantillonnage de réservoir pondéré peut être utilisée pour sélectionner plusieurs lignes ou même la table entière avec des probabilités pondérées, ce qui en fait une solution polyvalente pour divers scénarios de sélection de données.

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