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 MySQL Discussion :

Numéroter des occurrences du plus ancien au plus récent


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Par défaut Numéroter des occurrences du plus ancien au plus récent
    Bonjour,
    Je fais appel à vos lumières pour résoudre un problème de requête UPDATE pour numéroter des occurrences (id) du plus ancien au plus récent :
    Je dispose d'une table A contenant ces colonnes : Id, date, numb_occ

    id Date num_occ
    127 01/05/2014
    321 24/02/2019
    114 01/04/2021
    127 01/02/2012
    127 02/04/2013
    144 01/04/2022
    321 01/02/2020
    444 01/04/2020
    127 01/07/2022

    Résultat:

    id Date num_occ
    127 01/05/2014 3
    321 24/02/2019 1
    114 01/04/2021 1
    127 01/02/2012 1
    127 02/04/2013 2
    144 01/04/2022 1
    321 01/02/2020 2
    444 01/04/2020 1
    127 01/07/2022 4

    En vous remerciant par avance
    Bonne journée
    DE

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    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 633
    Billets dans le blog
    10
    Par défaut
    Bonjour

    Le plus simple, sous réserve d'avoir une version 8 de MySQL à minima, est d'utiliser la fonction ROW_NUMBER en triant sur la date

    Cela étant dit, c'est le plus souvent une très mauvaise idée de renuméroter les identifiants si on parle bien des colonnes PK.
    La valeur d'une PK bien conçue n'a aucun intérêt autre que d'être concise, unique et "not null", on se fout donc totalement de la notion de chronologie !
    Renuméroter les PK c'est devoir propager cette renumérotation dans toutes les FK sur toute la profondeur de cascade de ces FK, l'impact peut être considérable, voire monstrueux, et mettre par terre la base de données !

    Quel est le but recherché, pourquoi voulez-vous renuméroter ces id ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Par défaut Numéroter des occurrences du plus ancien au plus récent
    Bonjour,
    Merci de votre retour et de ces conseils. Je me suis mal exprimé. Ce n’est pas les id que je veux numéroter mais plutôt une nouvelle colonne que j’ai créé ( num_occ) qui vérifie les occurrences des Id, en fonction de la colonne date , du plus ancien au plus récent.
    Merci de votre aide
    DE

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    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 633
    Billets dans le blog
    10
    Par défaut
    Non c'est moi qui n'ai pas lu attentivement : j'ai tellement l'habitude de lire des questions sur "comment renuméroter les identifiants pour boucher les trous" que j'ai cru - à tort - qu'on était encore dans ce cas !

    Du coup je confirme, le plus simple est d'utiliser la fonction ROW_NUMBER().

    Avec le même jeu d'essai :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with table_A(A_ident, A_date) as
        (select 127, '2014-05-01'   union all
         select 321, '2019-02-24'   union all
         select 114, '2021-04-01'   union all
         select 127, '2012-02-01'   union all
         select 127, '2013-04-02'   union all
         select 144, '2022-04-01'   union all
         select 321, '2020-02-01'   union all
         select 444, '2020-04-01'   union all
         select 127, '2022-07-01'
        )

    La requête suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select A_ident
         , A_date
         , row_number()
           over(partition by A_ident
                order by A_date) as A_seq
    from Table_A
    order by A_ident
           , A_date


    Donne le résultat attendu :

    A_ident A_date A_seq
    114 2021-04-01 1
    127 2012-02-01 1
    127 2013-04-02 2
    127 2014-05-01 3
    127 2022-07-01 4
    144 2022-04-01 1
    321 2019-02-24 1
    321 2020-02-01 2
    444 2020-04-01 1

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Par défaut Numéroter des occurrences du plus ancien au plus récent
    Bonjour escartefigue,
    Merci beaucoup, c'est top! Autrement, sur une autre version mysql quelle requete je pourrais utiliser stp ? J'ai un autre poste avec une ancienne version.
    Si l'on peut partir sur une requête update qui permet d'implémenter la colonne num_occ , ce serait top
    Merci encore
    Bonne soirée
    DE

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    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 633
    Billets dans le blog
    10
    Par défaut
    La question "comment renuméroter les identifiants" est récurrente, j'ai répondu ce jour à un sujet similaire.

    Du coup je me suis fendu d'un billet de blog, ça évite de réinventer le fil à couper l'eau chaude comme disait un collègue.

    Voir ICI

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut à tous.

    Dans cet exemple, il y a plusieurs problèmes :

    1) On ne sait pas dans votre exemple si la clef primaire se rapporte à la colonne 'id' ou au couple ('id,date'). Il aurait été bien de le préciser.

    2) lors de l'insertion de vos lignes, pour un 'id' donné, est-ce que l'ordre des dates sera toujours croissante ou pas ?

    3) une date ne se stocke pas dans le type 'char' mais dans le type 'date'. De ce fait, le format de vos dates doit être sous la forme 'aaaa-mm-jj'.

    La solution proposée par Escartefigue fonctionne parfaitement à la condition d'être dans la version mysql 8.0 ou supérieure.

    Citation Envoyé par DJ2809
    Autrement, sur une autre version mysql quelle requête je pourrais utiliser stp ? J'ai un autre poste avec une ancienne version.
    Voici une autre solution, disons plus classique :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    set session collation_connection = "latin1_general_ci"
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `clef`  integer unsigned NOT NULL auto_increment primary key,
      `id`    integer unsigned NOT NULL,
      `date`  date             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`id`,`date`) VALUES
      (127,'2014-05-01'),(321,'2019-02-24'),(114,'2021-04-01'),(127,'2012-02-01'),(127,'2013-04-02'),
      (144,'2022-04-01'),(321,'2020-02-01'),(444,'2020-04-01'),(127,'2022-07-01')
    --------------
     
    --------------
    select * from `test` order by clef
    --------------
     
    +------+-----+------------+
    | clef | id  | date       |
    +------+-----+------------+
    |    1 | 127 | 2014-05-01 |
    |    2 | 321 | 2019-02-24 |
    |    3 | 114 | 2021-04-01 |
    |    4 | 127 | 2012-02-01 |
    |    5 | 127 | 2013-04-02 |
    |    6 | 144 | 2022-04-01 |
    |    7 | 321 | 2020-02-01 |
    |    8 | 444 | 2020-04-01 |
    |    9 | 127 | 2022-07-01 |
    +------+-----+------------+
    --------------
    alter table `test` add column `num` integer unsigned not null after `date`
    --------------
     
    --------------
    update `test` as t1
    left outer join (         select t3.id,
                                     t3.date,
                                     count(*) as num
                                from `test` as t3
                     left outer join `test` as t4
                                  on t4.id    = t3.id
                                 and t4.date <= t3.date
                            group by t3.id,t3.date
                    ) as t2
                 on t2.id   = t1.id
                and t2.date = t1.date
     
                set t1.num = t2.num
    --------------
     
    --------------
    select * from `test` order by clef
    --------------
     
    +------+-----+------------+-----+
    | clef | id  | date       | num |
    +------+-----+------------+-----+
    |    1 | 127 | 2014-05-01 |   3 |
    |    2 | 321 | 2019-02-24 |   1 |
    |    3 | 114 | 2021-04-01 |   1 |
    |    4 | 127 | 2012-02-01 |   1 |
    |    5 | 127 | 2013-04-02 |   2 |
    |    6 | 144 | 2022-04-01 |   1 |
    |    7 | 321 | 2020-02-01 |   2 |
    |    8 | 444 | 2020-04-01 |   1 |
    |    9 | 127 | 2022-07-01 |   4 |
    +------+-----+------------+-----+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Je ne vois pas trop l'intérêt de ce genre d'astuce car cela implique d'avoir l'ordre croissant d'insertion de vos dates. Est-ce le cas ?
    Vous utilisez une colonne pour faire un tri alors que cela existe déjà avec le couple (id ; date).
    Pouvez-vous nous expliquer l'intérêt de cette colonne et l'usage que vous en ferez ?

    Cordialement.
    Artemus24.
    @+

Discussions similaires

  1. Extraction des fichiers les plus récents d'un dossier
    Par aston01390 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 01/04/2015, 09h46
  2. Sélection des doublons les plus récents
    Par nitramm dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2008, 09h37
  3. Liste des enregistrements les plus récents
    Par calagan99 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/03/2008, 11h39
  4. Réponses: 1
    Dernier message: 31/01/2007, 11h49
  5. recup des enregistrement les plus récents.
    Par julien_guy dans le forum Langage SQL
    Réponses: 8
    Dernier message: 29/06/2004, 11h04

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