2013-11-11 3 views
-2

Здравствуйте, мне нужно лучшее решение для группировки данных по определенным периодам времени. Мне нужно сгруппировать данные месяца с 07:00:00 до 18:59:59, а затем с 19:00:00 до следующих дней 06:59:59. В базе данных есть много данных, поэтому предпочтительным было бы эффективное решение. Группа SQL по конкретному периоду времени

Также было бы здорово вставить букву Shift в запрос. Существует 4 смены: A, B, C, D и i имеют таблицу календаря.

Table [Shiftcalendar]: 
[ShiftDate] | [SHIFT] | [Nextshift] 
2013-11-11 | N |  A=B 
2013-11-11 | D |  C=A 
2013-11-10 | N |  D=C 
....  | .... | .... 

Столбец [Shift] представляет день или ночь, колонка [Nextshift] представляет собой сдвиг и следующую смену. N означает ночное время и с 19:00:00 до следующего дня 06:59:59, D означает день и с 07:00:00 до 18:59:59.

Table [wrkSpeedInfo]: 
[wrkActionDate]  | [wrkSpeed] | [wrkGlueValue] | [x1] 
2013-11-11 07:00:35 |  200 |  300  | 20 
2013-11-11 07:00:55 |  97  |  255  | 13 
2013-11-11 07:01:23 |  127 |  124  | 15 
....    |  .... |  ....  | .... 

Мне нужно SUM [wrkSpeed], [wrkGlueValue] и [x1].

Someones помощь будет очень признателен :)

PS .: Не возражаю мои английские навыки, я все еще на грани улучшения.

EDIT: До сих пор я делаю много запросов для получения конкретных дат и сдвигает данные, но хотел бы иметь все данные в одном запросе.

WHERE [wrkActionDate] BETWEEN '2013-10-03 07:00:00' AND '2013-10-03 18:59:59' 

я могу отправить полный запрос, но это занимает много места, и когда нужно было объяснить гораздо больше того, что я пытаюсь сделать.

EDIT: Ok кто-то сказал, чтобы отправлять полный запрос:

SELECT [wrkActionDate] 
    ,[wrkCntrId] 
    ,DATEDIFF(second, (SELECT TOP 1 t2.[wrkActionDate] FROM [DW].[dbo].[wrkSpeedInfo] as t2 WHERE [wrkCntrId] = 'S1' AND t2.[wrkActionDate] < t1.[wrkActionDate] ORDER BY t2.[wrkActionDate] DESC), [wrkActionDate])/60.0 AS MinPassed 
    ,SUM([wrkSpeed])*DATEDIFF(second, (SELECT TOP 1 t2.[wrkActionDate] FROM [DW].[dbo].[wrkSpeedInfo] as t2 WHERE [wrkCntrId] = 'S1' AND t2.[wrkActionDate] < t1.[wrkActionDate] ORDER BY t2.[wrkActionDate] DESC), [wrkActionDate])/60.0 AS SumWrkSpeed 
    ,SUM([wrkGlueValue])*DATEDIFF(second, (SELECT TOP 1 t2.[wrkActionDate] FROM [DW].[dbo].[wrkSpeedInfo] as t2 WHERE [wrkCntrId] = 'S1' AND t2.[wrkActionDate] < t1.[wrkActionDate] ORDER BY t2.[wrkActionDate] DESC), [wrkActionDate])/60.0 AS SumWrkGlueValue 
    ,SUM([x1]) AS SumX1 
FROM [DW].[dbo].[wrkSpeedInfo] as t1 
WHERE [wrkActionDate] BETWEEN '2013-10-03 07:00:00' AND '2013-10-03 18:59:59' AND [wrkCntrId] = 'S1' 
GROUP BY [wrkCntrId], [wrkActionDate] 

Так что, если я просто не мог получить все месяц данные в одном запросе, было бы здорово, потому что теперь только получать данные для одной смены.

Было бы здорово, чтобы получить что-то вроде:

[ShiftDate] | [SHIFT] | [Nextshift] | SUM([wrkSpeed]) | SUM([wrkGlueValue]) | SUM([x1]) 

EDIT: Они с помощью MS SQL 2012 не удается изменить структуру или что-нибудь, только может выбрать данные из БД.

+0

Я действительно пытался ... Но как раз в духе :(пока не хорошо SQL. – willCodeForBeer

+0

http://mattgemmell.com/2008/12/08/what-have-you-tried/ Если вы покажете некоторые из ваших sql до сих пор, это было бы полезно. –

+0

Люди закроют ваш вопрос или снизят его, если не видят никаких усилий. Измените сообщение с вашей попыткой, независимо от того, насколько он хромой. – Mihai

ответ

1

Если вы хотите, чтобы суммировать все значения только на основании дня вы просто должны GROUP BY CAST(wrkActionDate AS DATE)

Но вы не хотите, чтобы сгруппировать по дате именно вы хотите группы на основе вашего шаблона сдвига , Таким образом, вы можете создать поле, которое вычисляет, какой сдвиг относится к определенному времени, а затем группируется на основе этого поля.

SELECT [Shift] 
    ,SUM(wrkSpeed) AS wrkSpeed 
    ,SUM(wrkGlueValue) AS wrkGlueValue 
    ,SUM(x1) AS x1 
FROM(
    SELECT w.*, 
     CASE WHEN (DATEPART(HOUR, wrkActionDate) >= 7 AND DATEPART(HOUR, wrkActionDate) < 19) 
       THEN LEFT(CAST(wrkActionDate AS DATE),10)+' D' 
       ELSE LEFT(CAST(DATEADD(DAY, -1, wrkActionDate) AS DATE),10)+' N' 
      END AS [Shift] 
    FROM [DW].[dbo].wrkSpeedInfo w 
) w 
GROUP BY [Shift] 
+0

Постараюсь сделать что-то подобное. – willCodeForBeer

Смежные вопросы