2017-10-12 9 views
1

Il est possible de grouper simplement par n heures? J'ai trouvé des questions connexes pour les minutes, mais je ne peux pas le faire avec des heures.Groupe T- Sql par n heures

Je dois regrouper certaines données de 8 heures avec décalage.

Donc les 8 premières heures ne sont pas 00:00 - 08:00 mais 22:00 (hier) - 06:00 (aujourd'hui).

Je les ai groupés par heure et collés. Comment puis-je faire cela? Tout conseil est apprécié.

Répondre

2

Vous pouvez utiliser l'astuce DATEADD/DATEDIFF pour regrouper par intervalles de 8 heures.

Vous devez ajouter un décalage si, dans ce cas

  • Ajouter 2 heures pour passer 22 heures 30-0:30. Ou 07:30 retour à 09:30
  • Regrouper par intervalle de 8 heures (0-8, 8-16, 8-24)
  • Soustraire 2 pour décaler l'arrondi 00:00 à 22:00, ou l'arrondi à 8:00 06:00

Exemple de script

DECLARE @foo table (foo smalldatetime, bar int); 

INSERT @foo (foo, bar) 
VALUES 
    ('2017-10-11 21:00', 1), 
    ('2017-10-11 22:00', 2), 
    ('2017-10-11 23:00', 3), 
    ('2017-10-12 01:00', 4), 
    ('2017-10-12 03:00', 5), 
    ('2017-10-12 05:00', 6), 
    ('2017-10-12 07:00', 7), 
    ('2017-10-12 08:00', 8); 

SELECT 
    SUM(bar), 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0) 
FROM 
    @foo 
GROUP BY 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0); 
+0

Merci beaucoup pour votre aide – Bogu

0

Je ne sais pas ni données, ni entrée sortie (que vous devez fournir), mais voici une manière générale:

supposons que nous avons un tableau simple (nommé SimpleTable) avec 2 colonnes: temps de la vente de produits et la quantité vendue:

SellingTime    | Quantity 
2013-01-02 08:43:22.011 | 4 
2013-02-12 12:32:12.001 | 14 
etc. 

Maintenant, nous allons ajouter le numéro de commande à chaque jour: 1 pour le temps entre 22-6 etc.

SELECT SellingTime, Qunatity, 
     CASE WHEN DATEPART(hh, SellingTime) >= 22 AND DATEPART(hh, SellingTime) < 6 THEN 1 
      WHEN DATEPART(hh, SellingTime) >= 6 AND DATEPART(hh, SellingTime) < 14 THEN 2 
      ELSE 3 END AS NumberOfOrder 
FROM SimpleTable 

maintenant , tout ce que vous devez faire est de regrouper par NumberOfOrder et somme Quantity:

SELECT NumberOfOrder, SUM(Quantity) FROM (*) 

où la place de * vous mettez la première requête.