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

Langage SQL Discussion :

Garder 3 résultats à chaque nouvelles "ID"


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2020
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Garder 3 résultats à chaque nouvelles "ID"
    Bonjour,

    Je suis sous oracle SQL developper.

    Actuellement je travail sur une purge d'une base de donnée. Nous avons dans une table [I]Task[I] des ID. Je dois donc m'occuper d'un ID en particulier qui correspond à ce qu'on appelle : l'INVENTAIRE. Jusque là niveau code tous va bien. Puis on me demande de garder les 3 dernières lignes de cette tâche INVENTAIRE. J'ai donc créé ce code permettant de prendre la date de création de la ligne (real_start_date) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select *
    from
    (select *
    from task 
    order by real_start_date desc)
    where 
     IDTASK_TYPE = 163
     and real_start_date is not null
     and rownum <= 3
    ;
    Puis on me dis de garder les 3 dernières lignes par sources. Ce qui fait intervenir l'idproduct _source et type_product_source. Quand on dis par sources on veut dire que les idproduct_source et les type_product_source soit exactement les même dans les 3 lignes. Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select *
    from
    (select *
    from task 
    order by real_start_date desc)
    where 
     IDTASK_TYPE = 163
     and real_start_date is not null
     and rownum <= 3
    ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select *
    from task t
    WHERE NOT EXISTS(
    	  		 	Select *
    				from task ta
    				where t.idproduct_source = ta.idproduct_source
    				having(max(ta.idproduct_source) = t.idproduct_source)
    			)
     and IDTASK_TYPE = 163
     and real_start_date is not null
     and idproduct_source is not null
    ;
    Le problème étant que je ne récupère que les 3 dernières lignes mais que d'une seule source...

    J'ai fais plusieurs recherches sans arriver à trouver réponse à ma question... Ce qui m'embête bien... Pouvez vous m'aidez s'il vous plaît.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 152
    Points : 1 939
    Points
    1 939
    Par défaut
    Bonjour,

    Si c'est par source alors quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select *
    from (select t.*, row_number() over (partition by idproduct_source order by real_start_date desc) rn
          from task t
    	  where t.idtask_type = 163
             and t.real_start_date is not null
    	 )
    where rn <= 3;
    Par contre je vois pas où intervient type_product_source dans ton code?

  3. #3
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2020
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    excusez moi pour la réponse très tardive et je vous remercie pour votre réponse très rapide. J'ai testé le code ce matin et bien qu'il marche, il créé que des row_number à 1, empêchant donc de garder les 3 derniers IDPRODUCT_SOURCE... Ne connaissant pas over... partition by... Je suis un peu perdu avec ce code ^^'

    Qu'est ce qu'il y aurait à modifier? Et si c'est pas trop demandé, est ce que vous pourriez m'expliquer le code? J'ai beau regarder des cours sur partition by, je n'arrive pas à le comprendre.

    Merci encore pour la réponse et je tâcherais de répondre plus vite

    EDIT : TYPE_PRODUCT_SOURCE n'est en effet pas dans mon code puisque je me suis heurté au problème de IDPRODUCT_SOURCE. N'ayant pas la possibilité de vérifier si le code était potentiellement bon, je ne suis pas allé plus loin.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 152
    Points : 1 939
    Points
    1 939
    Par défaut
    Bonjour,

    Peux-tu monter un exemple avec le résultat attendu?

    Merci

  5. #5
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2020
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    En reprenant mon précédent code complet :

    Nom : Capture.PNG
Affichages : 96
Taille : 18,8 Ko

    Le soucis c'est que là j'en ai que pour 1 IDPRODUCT_SOURCE. Il me faudrait pour le 18, le 34 etc... (ce sont des exemples).

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Lyakyx Voir le message
    excusez moi pour la réponse très tardive et je vous remercie pour votre réponse très rapide. J'ai testé le code ce matin et bien qu'il marche, il créé que des row_number à 1, empêchant donc de garder les 3 derniers IDPRODUCT_SOURCE... Ne connaissant pas over... partition by... Je suis un peu perdu avec ce code ^^'
    Dans votre cas, vous voulez garder les 3 lignes d'inventaires les plus récente pour chaque article (IDPRODUCT_SOURCE)
    Traduit en SQL avec une fonction OLAP telle que ROW_NUMBER, cela donne un partitionnement par article (PARTITION BY IDPRODUCT_SOURCE) et un tri par date de création descendante (ORDER BY real_start_date desc)
    ROW_number ne fait qu'affecter un numéro de ligne unique par critère de partitionnement (IDPRODUCT_SOURCE) qui démarre à 1 pour la date la plus récente (puisque tri descendant) et s'incrément de 1 à chaque ligne

  7. #7
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2020
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    D'accord, merci pour la précision. Au final c'est bien ce que j'avais compris !

    Mais du coup, je n'arrive pas à voir quoi modifier puisque qu'actuellement, le row_number ne s'incrémente pas. Il reste bel et bien à 1 partout.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    Pouvez-vous communiquer un extrait de la table pour le critère de restriction (where t.idtask_type = 163)
    Car la requête proposée par Vanagreg est bien celle à appliquer, mais il faut pour cela qu'il y ait plusieurs lignes par article (est-ce le cas pour la tache 163?...)

  9. #9
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2020
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Voici le début de l'idtask 163 dans la table task:

    Nom : Capture.PNG
Affichages : 111
Taille : 56,8 Ko

    Il y a très exactement 108 563 lignes.

    EDIT : Oui il y a plusieurs lignes par articles mais pas pour tous. Par contre impossible qu'il n'y ait qu'un seul idproduct_source qui existe en 3 exemplaires.
    Images attachées Images attachées  

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    il aurait fallu limiter votre extraction aux colonnes intéressantes : IDTASK_TYPE, idproduct_source, real_start_date, idproduct_destination

    Quoi qu'il en soit, voici un essai réalisé avec Oracle 18c

    Création du jeu d'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    with tab1(IDTASK_TYPE, idproduct_source, real_start_date, idproduct_destination)
         as (select 163, 0003, '2020-01-15', 1226 from dual  union all
             select 163, 0003, '2020-01-18', 0016 from dual  union all
             select 163, 0003, '2020-01-10', 6692 from dual  union all
             select 163, 0003, '2020-01-20', 0661 from dual  union all
             select 164, 0003, '2020-01-02', 0004 from dual  union all
             select 164, 0004, '2020-01-05', 0100 from dual  union all
             select 163, 0008, '2020-02-06', 0018 from dual  union all
             select 163, 0008, '2020-02-16', 0019 from dual  union all
             select 163, 0040, '2020-03-01', 0050 from dual  union all
             select 163, 0040, '2020-03-02', 0052 from dual  union all
             select 163, 0040, '2020-03-03', 0055 from dual  union all
             select 163, 0040, '2020-03-04', 0060 from dual  union all
             select 180, 0080, '2020-03-01', 0050 from dual
            )
    Requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select * 
    from (select  IDTASK_TYPE
              ,  idproduct_source
              ,  real_start_date
              ,  idproduct_destination
              ,  row_number() 
                 over (partition by idproduct_source 
                       order by real_start_date desc) rn
          from tab1
          where idtask_type = 163
            and real_start_date is not null)
    where rn < 4
    Ça fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IDTASK_TYPE	IDPRODUCT_SOURCE	REAL_START_DATE	IDPRODUCT_DESTINATION	RN
    163	3	2020-01-20	661	1
    163	3	2020-01-18	16	2
    163	3	2020-01-15	1226	3
    163	8	2020-02-16	19	1
    163	8	2020-02-06	18	2
    163	40	2020-03-04	60	1
    163	40	2020-03-03	55	2
    163	40	2020-03-02	52	3

  11. #11
    Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2020
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour votre aide !!

    En effet ça marche très bien!!!

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

Discussions similaires

  1. Garder les objets du résultat pour nouvelles requêtes
    Par Orientationis dans le forum Débuter
    Réponses: 1
    Dernier message: 25/01/2009, 12h31
  2. Incrementer un type à chaque nouvelle saisie
    Par SOPSOU dans le forum Langage
    Réponses: 3
    Dernier message: 23/08/2007, 14h33
  3. [Tableaux] créer un lien à chaque nouvelle ligne
    Par anarchoi dans le forum Langage
    Réponses: 10
    Dernier message: 03/05/2007, 08h55
  4. Réponses: 6
    Dernier message: 27/08/2006, 18h57
  5. MAJ d'un attibut pour chaque nouvelle entrée
    Par yoshï dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 24/03/2006, 13h06

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