IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Select random limité par une somme


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Par défaut Select random limité par une somme
    Bonjour à tous et bonne année.

    Voici mon problème :
    J'ai 2 tables.
    La première disons TableA (id, mnt) contient plusieurs centaines de milliers de lignes et la seconde Param(Total, seuil), contient 1 seule ligne.

    Je cherche à effectuer une requête qui me retourne un nombre aléatoire de ligne dont la somme du champ mnt est comprise entre Total-seuil et Total+seuil.
    Le résultat doit être optimisé au niveau de la somme, le nombre de ligne retournées n'étant pas important.

    Sans forcément écrire l'algorithme, avez-vous des pistes que je pourrais explorer ?

    Cordialement,

    Yann

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Il y a la clause sample pour le select qui permet de examiner un nombre aléatoire des enregistrements à partir d'un pourcent des enregistrements ou blocs à examiner.
    Peut être que vous pouvez jouer d'abord avec une requête avec sample qui calcule juste la somme et vérifier par rapport à votre seuil. Ensuite les pourcentages sont à stoker quelque parts ainsi que le seed pour être capable de reproduire les cases favorables.
    Il devrait être possible en fonction de la spécificité des vos données et de la tolérance du seuil d'être capable a obtenir assez des jeux d'essai une fois que vous trouvez juste le bon pourcentage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Par défaut
    Ça pourrait être une piste, mais je vais avoir du mal à faire ça de manière automatique sachant que c'est l'utilisateur final qui va saisir son montant et son seuil et que je ne vais pas pouvoir le faire patienter trop longtemps.

    J'ai une piste en utilisant une cte avec une somme cumulative et sys_guid pour le tri aléatoire. Je vais voir ce que cela donne au niveau des perfs. Je posterai ma solution si cela convient.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui c'est la solution à laquelle j'ai pensé en lisant votre sujet.
    On pourrait aussi envisager une requête récursive mais côté performance ce serait probablement moins bon.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Par défaut
    Bon voici la structure de la requête (simplifiée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH CTE AS
      (SELECT ID,
        MNT,
        SUM (MNT) over (order by
        dbms_random.random rows unbounded preceding) sum_c
      FROM T
      )
    SELECT ID, MNT FROM CTE WHERE sum_c <=100000000
    J'ai pas pu encore tester sur la volumétrie cible par contre avec dbms_random.random j'ai effectivement un résultat aléatoire à chaque éxécution ce qui n'est pas le cas avec sys_guid où chaque exécution me renvoie le même résultat.

    Je vous tiens au courant dès que j'ai un retour sur les performances

Discussions similaires

  1. select avec résultat d'une somme
    Par natachalaunois dans le forum Développement
    Réponses: 4
    Dernier message: 08/06/2012, 17h10
  2. selection random à partir d'une liste d'objet
    Par emna hakem dans le forum C#
    Réponses: 4
    Dernier message: 29/04/2011, 20h09
  3. Diminuer la résolution de ma matrice par une somme
    Par Programmeurfou dans le forum MATLAB
    Réponses: 15
    Dernier message: 13/02/2009, 14h17
  4. SELECT / Remplacer le "." par une ","
    Par cluis dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/09/2006, 15h31
  5. [CR] limiter une somme
    Par kamga dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/09/2005, 21h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo