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 habitué
    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
    Points : 146
    Points
    146
    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 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 099
    Points : 28 390
    Points
    28 390
    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

  3. #3
    Membre habitué
    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
    Points : 146
    Points
    146
    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 : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    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 habitué
    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
    Points : 146
    Points
    146
    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 : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

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

  7. #7
    Membre habitué
    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
    Points : 146
    Points
    146
    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 : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    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 habitué
    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
    Points : 146
    Points
    146
    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 : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    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 habitué
    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
    Points : 146
    Points
    146
    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 éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    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 240
    Points : 12 872
    Points
    12 872
    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 : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    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 habitué
    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
    Points : 146
    Points
    146
    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 : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    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 habitué
    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
    Points : 146
    Points
    146
    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 849
    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 849
    Points : 52 978
    Points
    52 978
    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 +

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