Группировка по временному интервалу в SQL Server 2008 - PullRequest
0 голосов
/ 11 октября 2011

У меня есть такая структура таблицы:

ID BIGINT IDENTITY(1,1)
deviceID BIGINT NOT NULL,
entryTime DATETIME2 NOT NULL,
value FLOAT,
PRIMARY KEY (ID),
UNIQUE KEY (deviceID, entryTime)

У меня около 15 миллионов строк в этой таблице, и я хочу заполнить другую таблицу агрегированными данными из этой таблицы. Я хочу сгруппировать эти данные по deviceID в «корзины» размером один день и взять минимальное, максимальное и среднее значения для этого дня. Есть идеи, как мне это сделать?

Ответы [ 2 ]

6 голосов
/ 11 октября 2011

Что-то вроде:

SELECT CONVERT(DATE,entryTime) [Date],
       deviceId,
       MIN(Value) MinValue,
       MAX(Value) MaxValue,
       AVG(Value) AvgValue
FROM YourTable
GROUP BY CONVERT(DATE,entryTime),
         deviceId
1 голос
/ 11 октября 2011

Вы можете использовать Convert (DATE, entryTime) в качестве предложения select и group by, однако, если вы хотите сгруппировать по более конкретным или менее конкретным периодам времени, вы бы использовали что-то вроде:

INSERT INTO NEW_TABLE (deviceID, entryTime, min, max, avg)
SELECT deviceID, 
       DATEPART(yy, entryTime)+DATEPART(mm, entryTime)+DATEPART(dd, entryTime),
       MAX(value), 
       MIN(value), 
       AVG(value)
FROM OLD_TABLE 
       GROUP BY 
       deviceId, 
       DATEPART(yy, entryTime)+DATEPART(mm, entryTime)+DATEPART(dd, entryTime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...