例如,对于基于DAY 的分组,我会像这样使用GROUP BY(在动态SQL 中实现基于指定传感器的动态列命名):
DECLARE @sensorId_1 INT,
@sensorId_2 INT,
@startDateTime DATETIME,
@endDateTime DATETIME
-- For example, return data for Sensors 3 and 7 within the month of Feb 2016
SET @sensorId_1 = 3
SET @sensorId_2 = 7
SET @startDateTime = '2016-02-01'
SET @endDateTime = '2016-03-01'
DECLARE @sql NVARCHAR(MAX)
SET @sql =
'SELECT CAST([date] AS DATE) AS [Day],
SUM(CASE WHEN sensorId = ' + CONVERT(VARCHAR,@sensorId_1) + ' THEN 1 ELSE 0 END) AS Sensor_' + CONVERT(VARCHAR,@sensorId_1) + ',' +
' SUM(CASE WHEN sensorId = ' + CONVERT(VARCHAR,@sensorId_2) + ' THEN 1 ELSE 0 END) AS Sensor_' + CONVERT(VARCHAR,@sensorId_2) +
' FROM [SensorData]
WHERE sensorId IN (' + CONVERT(VARCHAR,@sensorId_1) + ', ' + CONVERT(VARCHAR,@sensorId_2) + ') ' +
' AND [date] >= ' + QUOTENAME(CONVERT(VARCHAR,@startDateTime,120),'''') +
' AND [date] < ' + QUOTENAME(CONVERT(VARCHAR,@endDateTime,120),'''') +
' GROUP BY CAST([date] AS DATE)
ORDER BY CAST([date] AS DATE)'
EXEC sp_executesql @sql
对于每小时的细分,我只需更改 @sql 定义:
SET @sql =
'SELECT CONVERT(VARCHAR,CAST([date] AS DATE)) + '' '' + CONVERT(VARCHAR,DATEPART(HOUR,[date])) + '':00'' AS [Hour],
SUM(CASE WHEN sensorId = ' + CONVERT(VARCHAR,@sensorId_1) + ' THEN 1 ELSE 0 END) AS Sensor_' + CONVERT(VARCHAR,@sensorId_1) + ',' +
' SUM(CASE WHEN sensorId = ' + CONVERT(VARCHAR,@sensorId_2) + ' THEN 1 ELSE 0 END) AS Sensor_' + CONVERT(VARCHAR,@sensorId_2) +
' FROM [SensorData]
WHERE sensorId IN (' + CONVERT(VARCHAR,@sensorId_1) + ', ' + CONVERT(VARCHAR,@sensorId_2) + ') ' +
' AND [date] >= ' + QUOTENAME(CONVERT(VARCHAR,@startDateTime,120),'''') +
' AND [date] < ' + QUOTENAME(CONVERT(VARCHAR,@endDateTime,120),'''') +
' GROUP BY CONVERT(VARCHAR,CAST([date] AS DATE)) + '' '' + CONVERT(VARCHAR,DATEPART(HOUR,[date])) + '':00''
ORDER BY CONVERT(VARCHAR,CAST([date] AS DATE)) + '' '' + CONVERT(VARCHAR,DATEPART(HOUR,[date])) + '':00'''
如果您希望能够动态指定时间间隔(分钟、日、月等)以及希望在每个“存储桶”中包含多少个该时间间隔的单位,那么您需要将其设为更复杂一点。
我会有一个CASE 语句来确定动态 SQL 是如何构建的,具体取决于(可能相当有限?)您可能想要处理的不同间隔集,但我不熟悉 PIVOT,所以也许这可以为您提供更优雅的解决方案。
无论如何,希望对GROUP BY 部分有所帮助,如果我完全错过了重点并且您已经理解了它的这个元素,请原谅!