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

Développement SQL Server Discussion :

[Requête SQL] Récupérer le jour et l'heure où la moyenne est la plus élevée


Sujet :

Développement SQL Server

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut [Requête SQL] Récupérer le jour et l'heure où la moyenne est la plus élevée
    Bonjour à tous,

    Je cherche à effectuer une requête SQL optimisée et j'avoue que je me tire actuellement les cheveux.

    Soit la table HISTORIQUE suivante :



    Voici ce que je cherche à récupérer :

    Pour chaque jour, l'heure à laquelle la moyenne des request_time est la plus élevée.

    Voici la requête actuellement construite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	SELECT DAY(creationdate) as JOUR, DATEPART(hour, creationdate) as HEURE, AVG(REQUEST_TIME) as MOYENNE
    	from historique 	
    	GROUP BY DAY(creationdate), DATEPART(hour, creationdate)
    Voici ce qu'elle retourne :




    Edit : et voici ce que je voudrais récupérer au final :




    Parmis les pro SQL qui parcourent le forum, y'en a-t-il un ou deux qui pourrait mettre son talent à ma disposition ?

    Je vous remercie par avance,

    Cordialement,

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Un premier exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT JOUR, HEURE, MAX(MOYENNE) AS MAXMOYENNE
    FROM
    (
    	SELECT DAY(creationdate) AS JOUR, DATEPART(hour, creationdate) AS HEURE, AVG(REQUEST_TIME) AS MOYENNE
    	FROM historique 	
    	GROUP BY DAY(creationdate), DATEPART(hour, creationdate)
    ) AGR(JOUR, HEURE, MOYENNE)
    Un autre :

    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
    SELECT Jour,
    		Heure,
    		MAX(Moyenne) AS MaxMoyenne
    FROM 
    (
    	SELECT DAY(creationdate) AS Jour,
    			DATEPART(hour, creationdate) As Heure,
    			AVG(request_time) AS Moyenne
    	FROM
    	(
    		SELECT creationdate, request_time
    		FROM dbo.historique
    	) BRUT (creationdate, request_time)
    	GROUP BY DAY(creationdate),
    			DATEPART(hour, creationdate)
    ) AGR (Jour, Heure, Moyenne)
    GROUP BY Jour, Heure
    ORDER BY Jour, Heure
    Et si vous êtes en version 2005 ou 2008 :

    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
    WITH
    	CTE_BRUT (creationdate, request_time) AS
    	(
    		SELECT creationdate, request_time
    		FROM dbo.historique
    	),
    	CTE_AGR (Jour, Heure, Moyenne) AS
    	(
    		SELECT DAY(creationdate) AS Jour,
    				DATEPART(hour, creationdate) As Heure,
    				AVG(request_time) AS Moyenne
    		FROM CTE_BRUT
    		GROUP BY DAY(creationdate), DATEPART(hour, creationdate)
    	)
    SELECT Jour, Heure, MAX(Moyenne) AS MaxMoyenne
    FROM CTE_AGR
    GROUP BY Jour, Heure
    ORDER BY Jour, Heure
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH
    	CTE_AGR (JOUR, HEURE, MOYENNE) AS
    	(
    		SELECT DAY(creationdate) AS JOUR, DATEPART(hour, creationdate) AS HEURE, AVG(REQUEST_TIME) AS MOYENNE
    		FROM historique 	
    		GROUP BY DAY(creationdate), DATEPART(hour, creationdate)
    	)
    SELECT JOUR, HEURE, MAX(MOYENNE)
    FROM CTE_AGR
    GROUP BY JOUR, HEURE
    ORDER BY JOUR, HEURE
    @++

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour ! Waou y'a du niveau là en SQL

    Je vais prendre le soin de regarder chacune de tes requêtes et de me documenter sur les fonctions utilisées.

    Néanmoins j'en ai exécuté une et je n'ai pas le résultat voulu. Je me suis permis d'éditer mon post afin d'être plus clair dans le résultat final souhaité :




    Encore merci !

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Désolé, j'ai compris d'où vient l'erreur

    Voici dès SQL Server 2005 :

    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
    WITH
    	CTE_BRUT (JOUR, HEURE, MOYENNE) AS
    	(
    		SELECT DAY(CREATION_DATE) AS JOUR,
    				DATEPART(hour, CREATION_DATE) AS HEURE,
    				AVG(REQUEST_TIME) AS MOYENNE
    		FROM Historique
    		GROUP BY DAY(CREATION_DATE), DATEPART(hour, CREATION_DATE)
    	),
    	CTE_MAX (JOUR, MAXMoyenne) AS
    	(
    		SELECT JOUR, MAX(MOYENNE) MAXMoyenne
    		FROM CTE_BRUT
    		GROUP BY JOUR
    	)
    SELECT B.JOUR,
    		B.HEURE,
    		B.MOYENNE
    FROM CTE_MAX M
    JOIN CTE_BRUT B
    	ON M.JOUR = B.JOUR
    	AND M.MAXMoyenne = B.MOYENNE
    ORDER BY B.JOUR

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Et pour SQL Server 2000 :

    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
    SELECT TMP.JOUR,
    		TMP.HEURE,
    		TMP.MOYENNE
    FROM
    (
    	SELECT DAY(CREATION_DATE) AS JOUR,
    			DATEPART(hour, CREATION_DATE) AS HEURE,
    			AVG(REQUEST_TIME) AS MOYENNE
    	FROM dbo.Historique
    	GROUP BY DAY(CREATION_DATE), DATEPART(hour, CREATION_DATE)
    ) TMP (JOUR, HEURE, MOYENNE)
    JOIN
    (
    	SELECT JOUR, MAX(MOYENNE) AS MaxMoyenne
    	FROM
    	(
    			SELECT DAY(CREATION_DATE) AS JOUR,
    					DATEPART(hour, CREATION_DATE) AS HEURE,
    					AVG(REQUEST_TIME) AS MOYENNE
    			FROM dbo.Historique
    			GROUP BY DAY(CREATION_DATE), DATEPART(hour, CREATION_DATE)
    	) BRUT (JOUR, HEURE, MOYENNE)
    	GROUP BY JOUR
    ) AGR(JOUR, MaxMoyenne)
    ON AGR.MaxMoyenne = TMP.MOYENNE
    AND AGR.JOUR = TMP.JOUR
    @++

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Magnifique merci !

    J'étais persuadé de tout pouvoir faire rentrer dans une requête et sans jointure, raaah.

    Résolu thx !

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

Discussions similaires

  1. Requête SQL de mise à jour
    Par viper87 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 21/01/2010, 20h37
  2. Requête SQL : récupérer un top rattaché à une colonne ?
    Par SetaSensei dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2008, 19h24
  3. Requête SQL de mise à jour
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 24/11/2006, 14h44
  4. Requête SQL : récupérer la valeur max
    Par Rodie dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/07/2006, 12h28
  5. [VB.NET] [SQL] Pb requête sql, récupérer des params. ?
    Par Pleymo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/02/2005, 21h15

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