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

Requêtes PostgreSQL Discussion :

Requête de selection dans une table contenant des redondances [9.5]


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 27
    Points : 27
    Points
    27
    Par défaut Requête de selection dans une table contenant des redondances
    Bonjour à tous, j'ai la table suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Finger_Prints (ID int , PERSON_ID int , SIGNATURE object, MARQUE varchar)
    Elle contient des enregistrements d'empreintes digitales pour des employés (le champs SIGNATURE contient l'empreinte), chaque employé normalement il a son PERSON_ID existant deux fois puisque il enregistre 2 doigts.

    Par mauvaise manipulation et manque de contrôle dans l'application qui gère la base de données, y'en a des employés qui sont redondants ça veut dire leurs PERSON_ID existent soit 4,6,10,12,14 ou 16 fois (j'ai pu constater ça maintenant on s'en fiche ).

    J'explique, prenant l'exemple d'un PERSON_ID qui se répète 10 fois, cela veut dire que cet employé a 10 fois ses empreintes enregistrées soit 5 fois chacun de ses 2 doigts comme illustre l'image ci dessous .
    Nom : Capture.PNG
Affichages : 157
Taille : 58,2 Ko

    Dans un premier temps j'ai réussi à écrire une requête qui me permet d'extraire les cas qui se répètent n fois {4,6,10,12,14 ou 16}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    "Time_stamp"."public"."finger_print"."id",
    "Time_stamp"."public"."finger_print"."person_id",
    "Time_stamp"."public"."finger_print"."signature",
    "Time_stamp"."public"."finger_print"."marque"
    FROM "Time_stamp"."public"."finger_print"
    WHERE "Time_stamp"."public"."finger_print"."person_id" IN (
    SELECT  "Time_stamp"."public"."finger_print"."person_id" 
     FROM "Time_stamp"."public"."finger_print" 
    GROUP BY  "Time_stamp"."public"."finger_print"."person_id" HAVING COUNT(*)=10)
    ORDER BY  "Time_stamp"."public"."finger_print"."person_id" ASC
    Maintenant depuis le résultat généré je veux sélectionner que 2 enregistrements pour chaque PERSON_ID contenant chacun une empreinte (je ne veux pas que l'empreinte se répète).

    J’espère que j'ai bien détaillé

    Merci d'avance

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Pour retrouver AU PLUS deux lignes par personne_id...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ID, PERSON_ID, SIGNATURE, MARQUE from Finger_Prints
    where ID in(
    			select rq.ID 
    				from (select c.ID, rank() over(PARTITION BY c.PERSON_ID order by c.ID) as rang from Finger_Prints as c) as rq 
    				where rq.rang<3
    			)
    Au cas où vous voulez supprimer les autres lignes, je vous propose de revoir la structure de votre table Finger_Prints...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Finger_Prints 
    (ID int ,
    PERSON_ID int ,
    SIGNATURE object,
    MARQUE varchar,
    finger smallint not null,
    constraint ckfingerplage check(finger in(1,2)),
    constraint ukpersonnefinger unique(PERSON_ID, finger )
    )
    Ceci permet d'éviter les doublons.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 27
    Points : 27
    Points
    27
    Par défaut
    Merci mec, ça m'a aidé énormément

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 07/10/2015, 11h12
  2. Réponses: 3
    Dernier message: 09/10/2014, 14h29
  3. delete dans une table contenant des primary key
    Par bracket dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/11/2008, 17h41
  4. [MySQL] Affichage de valeurs par selection dans une table
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/12/2005, 17h04
  5. Réponses: 2
    Dernier message: 07/11/2005, 18h54

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