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 :

Group By tranche de 10 minutes


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    jcd
    jcd est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut Group By tranche de 10 minutes
    Bonjour,

    Pour des analyses sur un système d'alarmes, je souhaite extraire sur une période d'une semaine le Nb d'alarmes apparues dans chaque tranche de 10 minutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT FctADefinir1(DateApparition) As Tranche10Min, Count(DateApparition) As NbAlmDansLaTranche
    FROM tAlarmes
    WHERE DateApparition BETWEEN '01/01/2012' AND '08/01/2012'
    GROUP BY FctaDefinir2(DateApparition)
    Où "Tranche10Min" pourrait être du genre '01/01/2012 00:00', '01/01/2012 00:10', '01/01/2012 00:20'... pour identifier chaque tranche

    Merci d'avance pour tout conseil sur FctADefinir1 et FctADefinir2, qui peuvent être soit des fonctions standard SQL Server, soit des fonctions "utilisateur".

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select getdate() as dt1
         , cast(floor(cast(getdate() as float)*24*6)/24/6 as datetime) as dt2
     
    dt1                     dt2
    ----------------------- -----------------------
    2012-01-13 12:14:43.960 2012-01-13 12:10:00.000

  3. #3
    jcd
    jcd est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Ok, merci super.

    Cela me retourne effectivement la tranche de 10 minutes dans laquelle il y eu au moins une alarme et le Nb d'alarmes apparues dans cette tranche de 10 minutes.

    Maintenant, pour continuer ma réflexion, si je veux tracer cela en graphique, il me serait plus simple d'obtenir autant d'enregistrement que de tranches de 10 min sur la période (soit l'affichage de toutes les tranches 10min) et le Nb d'alarmes correspondant par tranche (avec 0 - ou Null - pour toutes celles où il n'y a pas d'alarme) ?

    Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Tranche             Nb
    ------------------- -------------
    01/01/2012 00:00    4
    01/01/2012 00:10    0
    01/01/2012 00:20    0
    01/01/2012 00:30    2
    01/01/2012 00:40    0
    Encore merci par avance.

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Utilisez une table de temps avec vos intervalles de 10min.
    ll suffira de regrouper en fonction de ces colonnes pour avoir votre représentation finale.

    ++

  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 : 44
    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
    Par défaut
    Bonjour,

    Allez un petit coup de pouce

    Voici donc la table dont vous avez besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE tb_tranche_10_minutes
    (
    	debut_tranche datetime NOT NULL
    	, fin_tranche datetime NOT NULL
    	, CONSTRAINT PK_tb_tranche_10_minutes PRIMARY KEY (debut_tranche, fin_tranche)
    )
    GO
    Et la procédure stockée pour la peupler sans se fatiguer :

    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
    27
    28
    29
    30
    31
    32
    CREATE PROCEDURE usp_tb_date_10_minutes_peuple
    	@_annee_debut int
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF @_annee_debut IS NULL
    	BEGIN
    		RAISERROR('Le paramètre en entrée @_annee_debut doit être valué', 16, 1)
    		RETURN
    	END
     
    	IF LEN(@_annee_debut) <> 4
    	BEGIN
    		RAISERROR('La valeur %d pour le paramètre @_annee_debut est incorrecte', 16, 1, @_annee_debut)
    		RETURN
    	END
     
    	DECLARE @date_debut datetime
    		, @date_fin datetime
     
    	SELECT	@date_debut = CAST(CAST(@_annee_debut AS char(4)) AS datetime)
    	SELECT	@date_fin = DATEADD(year, 1, @date_debut)
     
    	WHILE @date_debut < @date_fin
    	BEGIN
    		INSERT	INTO dbo.tb_tranche_10_minutes (debut_tranche, fin_tranche)
    		SELECT	@date_debut, DATEADD(minute, 10, @date_debut)
     
    		SELECT @date_debut = DATEADD(minute, 10, @date_debut)
    	END
    END
    Pour peupler la table, il suffit d'exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC dbo.usp_tb_date_10_minutes_peuple 2012
    Sur mon petit PC portable, ça se fait en 30 secondes.
    Je me suis en suite créé la table d'alertes suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE alerte
    (
    	alerte_id int IDENTITY NOT NULL CONSTRAINT PK_alerte PRIMARY KEY
    	, alerte_date_time datetime NOT NULL
    )
    GO
     
    INSERT	INTO dbo.alerte (alerte_date_time)
    SELECT	'20120112 00:05:00'
    UNION ALL SELECT '20120112 00:15:00'
    UNION ALL SELECT '20120112 00:16:00'
    UNION ALL SELECT '20120112 00:17:00'
    UNION ALL SELECT '20120113 01:20:00'
    UNION ALL SELECT '20120113 01:21:00'
    Et la requête est alors simple a écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT		T.debut_tranche
    		, T.fin_tranche
    		, COUNT(*) AS occurences
    FROM		dbo.alerte AS A
    INNER JOIN	dbo.tb_tranche_10_minutes AS T
    			ON A.alerte_date_time >= T.debut_tranche
    			AND A.alerte_date_time < T.fin_tranche
    GROUP BY	T.debut_tranche, T.fin_tranche
    Ce qui donne :

    debut_tranche fin_tranche occurences
    ----------------------- ----------------------- -----------
    2012-01-12 00:00:00.000 2012-01-12 00:10:00.000 1
    2012-01-12 00:10:00.000 2012-01-12 00:20:00.000 3
    2012-01-13 01:20:00.000 2012-01-13 01:30:00.000 2
    @++

  6. #6
    jcd
    jcd est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Merci beaucoup ELSUKET pour tous les détails de cette explication.

Discussions similaires

  1. Comptez par tranche de x minutes
    Par flacdo dans le forum Requêtes
    Réponses: 15
    Dernier message: 09/05/2012, 15h59
  2. Réponses: 6
    Dernier message: 21/06/2011, 12h11
  3. GROUP BY sur 5 minutes, 5 heures, etc..
    Par Erakis dans le forum Requêtes
    Réponses: 20
    Dernier message: 28/01/2010, 10h46
  4. Group by date sans les heures: minutes: secondes
    Par KING_OF_GRACELAND dans le forum SQL
    Réponses: 13
    Dernier message: 13/03/2008, 10h37
  5. Cumul Heures\minutes pour un groupe
    Par neo.51 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 05/09/2006, 15h14

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