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

Langage SQL Discussion :

Group by par intervalles de 30 minutes


Sujet :

Langage SQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut Group by par intervalles de 30 minutes
    Bonjour à tous,

    J'ai une table avec :
    un champ Created as Datetime (ex : 2013-07-29 02.01.17.183)
    un champ Commande as Varchar. (ex : Erik)

    Je voudrais pouvoir faire un COUNT de mes commandes par intervalles de 30 minutes.

    J'aurais ceci comme réponse :

    8:00:00 5
    8:30:00 2
    9:00:00 4
    etc..

    J'ai cherché sur le net mais je tourne en round...

    Merci d'avance pour votre aide,

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  commande
        ,   CAST((CAST(created AS DATE) 
                + EXTRACT(HOUR FROM created) INTERVAL HOUR 
                + CAST((EXTRACT(MINUTE FROM created) / 30) AS INTEGER) * 30 INTERVAL MINUTE)
                AS DATETIME)    AS arrondi
        ,   COUNT(*)    AS nombre
    FROM    matable
    GROUP BY 1,2
    ;
    A vérifier, car je n'ai pas les moyens de tester
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Bonjour Ali,

    Merci pour ta réponse.

    Je ne sais pour qu'elle raison il ne prends pas le champ created...
    Il me dit invalid column name

    Hors ce champ existe dans ma DB.

  4. #4
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Puisqu'il n'est jamais trop tard...
    Essaye autrement dit il faut mettre le mot entre quote.
    @+

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Merci,

    Je pense que cella vient en fait que le serveur ne prends pas en charge la commande Extract...

  6. #6
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Quel SGBD vous utilisez?
    @+

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Voici l'information :

    Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )
    Trouvé en éxécutant la requête : @@version

  8. #8
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Essaye...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  CAST(created AS DATE) 
        ,  CASE DATEPART(MINUTE, "created") 
    when <=30 then datepart(HOUR, "created") + '00-' + datepart(HOUR, "created") +'30'
    else datepart(HOUR, "created") + '30-' + datepart(HOUR, "created") +'59'
    end
       AS interval_minute
        ,   COUNT(*)    AS nombre
    FROM    matable
    GROUP BY 1,2
    @+

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Ca a l'air de mieux marcher mais je ne sais pour quelle raison il me dit :

    Msg 102, Level 15, State 1, Line 25
    Incorrect syntax near '<'.

  10. #10
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Mauvaise manière d'utiliser "CASE"
    Correction...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  CAST(created AS DATE) 
        ,  CASE
    when  DATEPART(MINUTE, "created") <=30 then datepart(HOUR, "created") + '00-' + datepart(HOUR, "created") +'30'
    else datepart(HOUR, "created") + '30-' + datepart(HOUR, "created") +'59'
    end
       AS interval_minute
        ,   COUNT(*)    AS nombre
    FROM    matable
    GROUP BY 1,2

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Super elle s'éxécute bien maitenant.

    Par contre j'ai du enlever les "-" du 00 et 30

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT CAST(created AS DATE) AS CreateDate, 
           CASE
    		when  DATEPART(MINUTE, "created") <=30 then datepart(HOUR, "created") + '00' + datepart(HOUR, "created") +'30'
    		else datepart(HOUR, "created") + '30' + datepart(HOUR, "created") +'59'
    end
       AS interval_minute
        ,   COUNT(*)    AS nombre
    FROM   ma table
    WHERE CAST(created AS DATE) > '2013-08-01'
    GROUP BY Created
    Par contre au niveau résultat j'ai ceci :
    CreateDate	interval_minute	nombre
    2013-08-02	95	1
    2013-08-02	38	1
    2013-08-02	97	1
    2013-08-02	97	1
    2013-08-02	40	1
    2013-08-02	99	1

  12. #12
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 423
    Par défaut
    Bonjour,
    Il faut soit appliquer une fonction d'agrégation sur la "colonne" intervalle_minute (sum,count,avg...), soit l'inclure dans la clause GROUP-BY.

    Tatayo.

  13. #13
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Apparemment sql sever fait un calcul arithmétique là où je veux une concaténation de chaine.
    Essayons...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT CAST(created AS DATE) AS CreateDate,
    CASE
    when DATEPART(MINUTE, "created") <=30 then cast(datepart(HOUR, "created") as char(2)) + '00' + cast(datepart(HOUR, "created") as char(2)) +'30'
    else cast(datepart(HOUR, "created") as char(2))+ '30' + cast(datepart(HOUR, "created") as char(2)) +'59'
    end
    AS interval_minute
    , COUNT(*) AS nombre
    FROM ma table
    WHERE CAST(created AS DATE) > '2013-08-01'
    GROUP BY 1,2 --il faut suivre le conseil de tatayo!!!
    @+

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Alors si j'execute la requete comme ca j'ai cette erreur :
    Each GROUP BY expression must contain at least one column that is not an outer reference.

    C'est pour cette raison que j'avais changé le GROUP BY par Created.

    Avec le group by changé :

    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
    SELECT CAST(created AS DATE) AS CreateDate,
    CASE
    when DATEPART(MINUTE, "created") <=30 then cast(datepart(HOUR, "created") AS char(2)) + '00' + cast(datepart(HOUR, "created") AS char(2)) +'30'
    else cast(datepart(HOUR, "created") AS char(2))+ '30' + cast(datepart(HOUR, "created") AS char(2)) +'59'
    end
    AS interval_minute
    , COUNT(*) AS nombre
    FROM ma table WHERE CAST(created AS DATE) > '2013-08-01'
    GROUP BY Created --il faut suivre le conseil de tatayo - Désolé tatayo ^^!!!
     
    CreateDate	interval_minute	nombre
    2013-08-02	3 303 59	1
    2013-08-02	4 004 30	1
    2013-08-02	4 304 59	1
    2013-08-02	4 304 59	1
    2013-08-02	5 005 30	1

  15. #15
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Peut-être que sql server n'accepte pas la construction Il faut prendre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT CAST(created AS DATE) AS CreateDate,
    CASE
    when DATEPART(MINUTE, "created") <=30 then cast(datepart(HOUR, "created") AS char(2)) + '00' + cast(datepart(HOUR, "created") AS char(2)) +'30'
    else cast(datepart(HOUR, "created") AS char(2))+ '30' + cast(datepart(HOUR, "created") AS char(2)) +'59'
    end
    AS interval_minute
    , COUNT(*) AS nombre
    FROM ma TABLE
    WHERE CAST(created AS DATE) > '2013-08-01'
    GROUP BY CAST(created AS DATE),(CASE
    when DATEPART(MINUTE, "created") <=30 then cast(datepart(HOUR, "created") AS char(2)) + '00' + cast(datepart(HOUR, "created") AS char(2)) +'30'
    else cast(datepart(HOUR, "created") AS char(2))+ '30' + cast(datepart(HOUR, "created") AS char(2)) +'59'
    end)

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Par défaut
    Effectivement cela fonctionne sans le GROUP BY 1,2 Je ne sais pas pourquoi...

    Voici le résultat.

    CreateDate	interval_minute	nombre
    2013-08-01	0 000 30	             1
    2013-08-01	10001030	3
    2013-08-01	10301059	9
    2013-08-01	11001130	10
    2013-08-01	11301159	9
    2013-08-01	12001230	7
    2013-08-01	12301259	10
    2013-08-01	13001330	10
    2013-08-01	13301359	9
    2013-08-01	14001430	13
    2013-08-01	14301459	7
    2013-08-01	15001530	13

  17. #17
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    GROUP BY 1, 2 ne fait pas partie de la norme SQL.
    Seul ORDER BY supporte cette fonctionnalité, car ce n'est pas un opérateur relationnel....

    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/ * * * * *

Discussions similaires

  1. Calculer la moyenne par intervalle de 5 minutes
    Par nngoned dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/07/2013, 14h37
  2. Réponses: 3
    Dernier message: 16/08/2006, 16h05
  3. traiter les groupes retourné par la requête GROUP BY
    Par mgemc2 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/08/2006, 13h16
  4. [sql 9i] group by par années ;)
    Par booth dans le forum Oracle
    Réponses: 7
    Dernier message: 04/10/2005, 10h42
  5. [CR8] Groupes nommés par ordre spécifié
    Par PschittN dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/05/2004, 23h46

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