MSSQL包含多列的聚合时间查询


MSSQL Aggregated time query with multiple columns

在这个例子中,我正在收集一辆汽车的一些引擎数据。

Variables
--------------------------------------
id  | name
--------------------------------------
1     Headlights On 
2     Tire Pressure
3     Speed
4     Engine Runtime in Seconds
...

Values
--------------------------------------
id  |  var_id  | value  | time
--------------------------------------
1      1          1       2013-05-28 16:42:00.100
2      1          0       2013-05-28 16:42:22.150
3      2          32.0    2013-05-28 16:42:22.153
4      3          65      2013-05-28 16:42:22.155
...

我想编写一个返回结果集的查询,如下所示:

Input: 1,2,3

Time                | Headlights On | Tire Pressure | Speed
---------------------------------------------------------------
2013-05-28 16:42:00   1                                  
2013-05-28 16:42:22   0               32              65

能够修改查询以只包含给定变量集的结果,并且在指定的间隔(1秒,1分钟或5分钟),对于我的用例也非常重要。

如何在T-SQL中编写查询,以在特定间隔返回时间聚合的多列结果集?

1分钟累计:

SELECT {edit: aggregate functions over fields here} FROM Values WHERE {blah} GROUP BY DATEPART (minute, time);

5分钟集料:

SELECT {edit: aggregate functions over fields here} FROM Values WHERE {blah} GROUP BY
  DATEPART(YEAR, time),
  DATEPART(MONTH, time),
  DATEPART(DAY, time),
  DATEPART(HOUR, time),
  (DATEPART(MINUTE, time) / 5);

由于后一部分是如此复杂的原因,请参阅这里的so帖子:如何按小时或按10分钟分组时间。

编辑1:对于部分"只包括一组给定变量的结果",我的解释是,您希望将值与var_id隔离在指定的集合内。如果您可以依赖变量数/含义不变,常见的SQL解决方案是IN关键字(http://msdn.microsoft.com/en-us/library/ms177682.aspx)。

这是你应该在上面的WHERE子句中输入的内容,例如

... WHERE var_id IN (2, 4) ...

如果你不能依赖于知道变量的编号,但可以确定它们的名称,你可以用子查询来替换这个集合,例如:

... WHERE var_id IN (SELECT id FROM Variables WHERE name IN ('Tire Pressure','Headlights On')) ...

另一种解释是,您实际上也希望基于变量id进行聚合。在这种情况下,您必须在GROUP BY子句中包含var_id。

为了使结果更像交叉表,我猜您将希望按您正在使用的时间聚合排序。

Try

SELECT
    VehicleID
    , Case WHEN Name = 'Headlights on' THEN 1
     Else 0 END ' as [Headlights on]
    , Case WHEN Name = 'Tyre pressure' THEN Value
     Else CAST( NULL AS REAL) END ' as [Tyre pressure]
 , DateName(Year, DateField) [year ]
FROM
   Table

然后按要求聚合

SELECT
      VehicleID
      , SUM([Headlights on]) SUM([Headlights on],
FROM 
(
QUery above
) S
GROUP BY
VehicleID
, [Year]