Здравствуйте, мне нужно лучшее решение для группировки данных по определенным периодам времени. Мне нужно сгруппировать данные месяца с 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 не удается изменить структуру или что-нибудь, только может выбрать данные из БД.
Я действительно пытался ... Но как раз в духе :(пока не хорошо SQL. – willCodeForBeer
http://mattgemmell.com/2008/12/08/what-have-you-tried/ Если вы покажете некоторые из ваших sql до сих пор, это было бы полезно. –
Люди закроют ваш вопрос или снизят его, если не видят никаких усилий. Измените сообщение с вашей попыткой, независимо от того, насколько он хромой. – Mihai