2015-03-05 1 views
-1

Je dispose d'une table de faits d'entrepôt contenant des données brutes (même des données en double) reçues du fournisseur via un flux de données. J'ai besoin de préparer le morceau de 15 données d'intervalle min. Comment puis-je mieux SQL Server requête pour le faire. EgSample donnéesTSQL pour préparer des données de tronçon de 15 min

ID key Date        Value 
1 1 2013-10-08 00:00:00.000  10 
2 1 2013-10-08 00:23:00.000  15 
3 1 2013-10-08 01:00:00.000  20  
4 1 2013-10-08 01:15:00.000  25 
5 1 2013-10-08 01:30:00.000  30 
6 1 2013-10-08 01:35:00.000  30 
7 1 2013-10-08 01:50:00.000  30 
8 1 2013-10-08 01:55:00.000  30 
+2

Veuillez poster votre sortie attendue. –

+0

quels tableaux de dimension temporelle avez-vous? ne seront-ils pas utilisés? –

Répondre

0

Batching par lots fixes pour chaque trimestre de l'heure, en construisant une nouvelle colonne qui spécifie le début de chaque lot:

SELECT 
    *, 
    CASE 
     WHEN (DATEPART(minute, [Date]) >= 0 AND DATEPART(minute, [Date]) < 15) THEN DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 0, 0, 0) 
     WHEN (DATEPART(minute, [Date]) >= 15 AND DATEPART(minute, [Date]) < 30) THEN DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 15, 0, 0) 
     WHEN (DATEPART(minute, [Date]) >= 30 AND DATEPART(minute, [Date]) < 45) THEN DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 30, 0, 0) 
     ELSE DATETIMEFROMPARTS (DATEPART(year, [Date]), DATEPART(month, [Date]), DATEPART(day, [Date]), DATEPART(hour, [Date]), 45, 0, 0) 
    END AS BatchStart 
FROM 
    Fact 
ORDER BY 
    [Date] 

Résultat pour votre exemple:

ID key Date      Value BatchStart 
1 1 2013-10-08 00:00:00.000 10  2013-10-08 00:00:00.000 
2 1 2013-10-08 00:23:00.000 15  2013-10-08 00:15:00.000 
3 1 2013-10-08 01:00:00.000 20  2013-10-08 01:00:00.000 
4 1 2013-10-08 01:15:00.000 25  2013-10-08 01:15:00.000 
5 1 2013-10-08 01:30:00.000 30  2013-10-08 01:30:00.000 
6 1 2013-10-08 01:35:00.000 30  2013-10-08 01:30:00.000 
7 1 2013-10-08 01:50:00.000 30  2013-10-08 01:45:00.000 
8 1 2013-10-08 01:55:00.000 30  2013-10-08 01:45:00.000 
0

Ceci arrondira à la plus proche 15 minutes

SELECT dateadd(minute, datediff(minute, 0, Date)/15*15, 0) 
FROM yourtable