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

PHP & Base de données Discussion :

sql : calculer la différence entre 2 valeurs d'une colonne


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2018
    Messages : 56
    Par défaut sql : calculer la différence entre 2 valeurs d'une colonne
    Bsr,
    Est-il possible de simplifier ces 2 requête pour obtenir la différence entre elles dans une cellule "delta" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT maires_nb FROM nbr_maires WHERE id = (SELECT MAX(id) FROM nbr_maires);
    SELECT maires_nb FROM nbr_maires WHERE id = (SELECT MAX(id) -1 FROM nbr_maires);

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT maires_nb FROM nbr_maires WHERE id > (SELECT MAX(id)-2 FROM nbr_maires);

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 310
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 310
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
        (SELECT maires_nb FROM nbr_maires WHERE id = (SELECT MAX(id) FROM nbr_maires))
        -
        (SELECT maires_nb FROM nbr_maires WHERE id = (SELECT MAX(id) -1 FROM nbr_maires))
        AS delta
    ;
    Mais le procédé est très mauvais, on ne peut pas faire sereinement des opérations comme MAX(id) - 1, ça n'a pas de sens.

    Donne-nous plutôt le schéma de ta table, un échantillon de données, et le résultat que tu veux en sortir.

  4. #4
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2018
    Messages : 56
    Par défaut sql : calculer la différence entre 2 valeurs d'une colonne
    Bsr,

    Merci à vous 2 pour vos propositions.
    Ma demande était en effet "impossible".

    J'ai opté pour bcp plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM nbr_maires ORDER BY id DESC LIMIT 1
    ce qui me permet de trouver les données de et de simplement dans mes requêtes.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 442
    Par défaut
    Le principal ennui, ici, est que tu ne peux pas être certain qu'une entrée identifiée par « max(id) - 1 » existe forcément si ladite entrée a été supprimée avant ton appel.

    Si tu t'autorises SQL:2003 (plus de vingt ans tout de même), tu peux en revanche utiliser les fonctions OLAP, avec lesquelles ont été notamment introduites les fonctions ROW() et RANK() : https://sqlpro.developpez.com/articl...clause-window/

    ROW() te permet alors de demander directement au SGBD de produire un numéro de ligne, sur laquelle tu peux ensuite poser un filtre, en ne récupérant que les lignes où ROW() est inférieur ou égal à 2.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    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 544
    Billets dans le blog
    10
    Par défaut
    Non seulement on n'est pas certain qu'il existe une ligne portant l'identifiant de valeur max(id) - 1, mais, si l'identifiant est calculé par le SGBD (identity, counter, auto_increment...) on n'est pas non plus certain que l'identifiant dont la valeur est la plus forte est celui le plus récent !
    Il faut rappeler que dans un environnement multi utilisateurs et multi threads, la distribution des valeurs d'identifiants attribuées par le SGBD n'est pas séquentielle : elle se fait le plus souvent par paquets à chaque thread ayant des insertions à traiter.
    Par exemple, un thread 1 reçoit du moteur du SGBD les valeurs d'id 100 à 109 pour son prochain lot d'insertions alors qu'un autre thread 2 reçoit les valeurs d'id 110 à 119 (cas de lots de 10 id).
    Mais rien n'interdit que ce soit le 2e thread qui commite le premier tout ou partie des identifiants qu'il a reçus, auquel cas l'identifiant 115 du thread 2, par exemple, sera commité AVANT l'identifiant 108 du thread 1.
    Il va sans dire que tout ou partie des identifiants reçus peut ne pas être commité, d'où les "trous" de numérotation.

    Il ne faut jamais utiliser une valeur d'identifiant attribuée par le SGBD pour un usage fonctionnel. Si l'on a besoin d'une chronologie de création, il faut disposer d'un horodatage fin (ie timestamp) de création de la ligne.

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 942
    Par défaut
    re,

    Pas bien compris le besoin, ni les données initiales

    Est-ce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id
    	,maires_nb
    	,lag(id) over (order by id) as id_prec
    	,lag(maires_nb) over (order by id) as maires_nb_prec
    FROM nbr_maires
    order by id desc
    Va dans le "bon" sens ?

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    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 544
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Est-ce que [. . .]
    Va dans le "bon" sens ?
    Il n'y a pas de bon sens quand on utilise un identifiant technique comme critère fonctionnel et en particulier, comme très souvent, pour tenter - en vain - d'en déduire une chronologie.

    Cf. ma réponse précédente.

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

Discussions similaires

  1. Compter le nombre de cellules vides entre les valeurs d'une colonne
    Par ermalybo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/03/2017, 18h19
  2. Réponses: 1
    Dernier message: 17/08/2016, 18h28
  3. [Toutes versions] Requête - calcul de délai entre deux valeurs d'un même champ
    Par remi59 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 05/02/2010, 11h53
  4. Calcul du maximum entre plusieurs valeurs
    Par gastaman dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/11/2006, 11h07

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