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

 PostgreSQL Discussion :

Isoler le début et la fin d'un résultat de requête [8.4]


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Isoler le début et la fin d'un résultat de requête
    Bonjour,

    Depuis quelques jours je tourne en rond sur un problème.
    Le voici:

    Je souhaiterais faire une moyenne entre 2 nombre. Ce nombre est obtenu en faisant la différence entre 2 dates.
    Jusqu'ici tout va bien.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select lbl_pays
    , lbl_ville
    , round(avg(etape.d_arrivée::date - ville.d_départ::date),2)
    , min(etape.d_arrivée::date - ville.d_départ::date)
    , max(etape.d_arrivée::date - ville.d_départ::date)
    from pays pays
    inner join ville ville on pays.id_pays = ville.id_pays
    inner join étape etape on etape.id_planification = ville.id_planif

    Mais je souhaiterais isoler les incohérences (différences entre 2 dates irréelles) en excluant les 10% les plus basses et les 10% les plus hautes du résultat avant de faire ma moyenne.

    Voici une exemple des tables:

    pays
    id_pays lbl_pays
    FR France
    IT Italie
    ES Espagne


    ville
    id_pays id_ville lbl_ville id_planif d_départ
    FR PAR PARIS 124 01/02/2018
    FR LILLE LILLE 532 02/02/2018
    FR LYO LYON 724 03/02/2018
    FR BRE BREST 212 01/12/2017
    FR ARC ARCACHON 945 02/12/2017
    ES GRE GRENADE 634 03/12/2017
    ES BAR BARCELONE 563 01/10/2016
    ES VAL VALENCE 876 02/10/2016
    ES SEV SEVILLE 347 03/10/2016
    ES IBI IBIZA 876 04/10/2016

    Etapes
    id_planification d_arrivée
    124 03/02/2018
    532 22/01/2018
    724 03/01/2018
    212 01/12/2018
    945 02/12/2016
    634 03/11/2017
    563 01/11/2016
    876 02/09/2016
    347 02/10/2016
    836 04/12/2016

    J'espère avoir été clair!!!

    Merci

  2. #2
    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,

    Un truc dans ce gout là (pas testé)

    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
     
    WITH tmp AS (
    select lbl_pays
    , lbl_ville
    , etape.d_arrivée
    , ville.d_départ
     
    , NTILE(100) OVER (ORDER BY etape.d_arrivée::date - ville.d_départ::date) AS rep
    from pays pays
    inner join ville ville on pays.id_pays = ville.id_pays
    inner join étape etape on etape.id_planification = ville.id_planif
    )
    SELECT 
        lbl_pays
        , lbl_ville
        , round(avg(d_arrivée::date - d_départ::date),2)
    FROM tmp
    WHERE rep BETWEEN 10 AND 90
    GROUP BY  
       lbl_pays
        , lbl_ville

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Vous pouvez utiliser les fonction de fenêtrage PERCENTILE_CONT et PERCENTILE_DISC qui sont faites pour cela en prenant les 80 "tile" du milieu.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Bonjour et merci à tous pour vos réponse.

    Du coup j'ai utilisé l'écart type pour affiner mon résultat mais dans report studio (COGNOS 8).

    Bonne journée

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/04/2008, 16h19
  2. [Dates] Calculer le début et la fin du mois
    Par pas30 dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2007, 15h34
  3. Réponses: 3
    Dernier message: 19/11/2007, 13h11
  4. Réponses: 5
    Dernier message: 05/09/2007, 09h37
  5. Réponses: 19
    Dernier message: 10/07/2007, 09h24

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