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 :

Trouver lignes sans données


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 34
    Points : 18
    Points
    18
    Par défaut Trouver lignes sans données
    Bonjour,

    J'ai une table alimentée de données par une API une à plusieurs fois par jour. La table est constituée de différentes données dont une colonne date.
    J'ai constaté que certains jours, je n'avais aucune données. Ce qui n'est pas normal.

    Sauriez-vous comment faire une requête pour identifier toutes les dates pour lesquelles je n'ai aucune donnée ?

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il suffit de construire une table "calendrier" avec une ligne par date, et de faire un not-exist/un not in/une jointure externe pour trouver les dates sans lignes dans ta table.

    Tatayo.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Merci @tatayo pour ce retour.

    Existe-t-il une solution sans passer par une autre table ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Tu ne nous indiques pas quelle version de MySQL tu utilises, mais si celle-ci les supporte tu peux remplacer la table calendrier par une requête récursive dans une CTE.

    Tatayo.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Une table calendrier est recommandée si, pour certains jours, il est normal de ne pas avoir d'enregistrements (jours fériés, fermetures exceptionnelles, congés annuels...).
    Dans ce cas, vous rechercherez l'absence d'enregistrement uniquement pour les jours non marqués "sans enregistrement" dans ce calendrier avec l'une des méthodes proposées par Tatayo

    S'il n'y a pas d'exception ou que les exceptions sont seulement les WE, une CTE peut faire l'affaire, sous réserve que vous utilisiez la version 8 de MySQL, les précédentes ne connaissant pas les CTE.

  6. #6
    Membre régulier
    Homme Profil pro
    Analyste-programmeur
    Inscrit en
    Décembre 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2014
    Messages : 52
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par mezvin Voir le message
    Merci @tatayo pour ce retour.

    Existe-t-il une solution sans passer par une autre table ?
    La solution proposée (une table calendrier) est **DE LOIN** la méthode la plus simple et la plus efficace...

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il me semble que la version 8 a également introduit les fonctions fenêtrées, auquel cas LEAD ou LAG permettrons de trouver facilement les "trous"

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    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 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Citation Envoyé par mezvin
    J'ai constaté que certains jours, je n'avais aucune données.
    Comment se traduit l'absence de données ? Par un NULL ? Par une chaîne de caractères à vide ? Une date à "0000-00-00 00:00:00" ? Ou un trou ?

    Citation Envoyé par Tatayo
    tu peux remplacer la table calendrier par une requête récursive dans une CTE.
    Cette solution fonctionne que si MySql est en version 8.0.

    Je traite le cas où il y a ds trous :
    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
    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `calendrier`
    --------------
     
    --------------
    CREATE TABLE `calendrier`
    ( `periode`  date NOT NULL PRIMARY KEY
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS remplir
    --------------
     
    --------------
    CREATE PROCEDURE remplir (IN In_deb date,
                              IN In_fin date)
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE _date  date  DEFAULT NULL;
     
      SET _date = In_deb;
     
      while (_date <= In_fin)
      do
        insert into `calendrier` (`periode`) values (_date);
        set _date = DATE_ADD(_date,INTERVAL 1 DAY);
      end while;
    END
    --------------
     
    --------------
    call remplir('2019-03-01','2019-03-13')
    --------------
     
    --------------
    select * from `calendrier`
    --------------
     
    +------------+
    | periode    |
    +------------+
    | 2019-03-01 |
    | 2019-03-02 |
    | 2019-03-03 |
    | 2019-03-04 |
    | 2019-03-05 |
    | 2019-03-06 |
    | 2019-03-07 |
    | 2019-03-08 |
    | 2019-03-09 |
    | 2019-03-10 |
    | 2019-03-11 |
    | 2019-03-12 |
    | 2019-03-13 |
    +------------+
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`    integer  unsigned NOT NULL auto_increment PRIMARY KEY,
      `date`  datetime          NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`date`) values
      ('2019-03-01'),('2019-03-03'),('2019-03-04'),('2019-03-05'),('2019-03-06'),
      ('2019-03-07'),('2019-03-09'),('2019-03-10'),('2019-03-11'),('2019-03-12'),('2019-03-13')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------------------+
    | id | date                |
    +----+---------------------+
    |  1 | 2019-03-01 00:00:00 |
    |  2 | 2019-03-03 00:00:00 |
    |  3 | 2019-03-04 00:00:00 |
    |  4 | 2019-03-05 00:00:00 |
    |  5 | 2019-03-06 00:00:00 |
    |  6 | 2019-03-07 00:00:00 |
    |  7 | 2019-03-09 00:00:00 |
    |  8 | 2019-03-10 00:00:00 |
    |  9 | 2019-03-11 00:00:00 |
    | 10 | 2019-03-12 00:00:00 |
    | 11 | 2019-03-13 00:00:00 |
    +----+---------------------+
    --------------
    select           *
               from  `calendrier` as t1
     
    left outer join  `test` as t2
                 on  t2.date = t1.periode
     
              where  t2.date is null
    --------------
     
    +------------+------+------+
    | periode    | id   | date |
    +------------+------+------+
    | 2019-03-02 | NULL | NULL |
    | 2019-03-08 | NULL | NULL |
    +------------+------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. [XL-2010] Trouver la derniere ligne sans connaitre la colonne
    Par Denis_67 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 16/10/2014, 14h00
  2. Extraction de données d'une ligne sans doublon
    Par fmris dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/07/2014, 16h15
  3. Trouver la prochaine ligne sans certaines valeurs
    Par sebhm dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/10/2012, 15h15
  4. [V5] Remonter des lignes sans données ?
    Par gaugau3000 dans le forum Deski
    Réponses: 1
    Dernier message: 16/04/2009, 15h27
  5. [VxiR2] Filtre sur un tableau sans faire sauter les lignes sans données
    Par tatayoyo dans le forum Deski
    Réponses: 3
    Dernier message: 20/03/2009, 10h35

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