MSSQL具有多列的聚合时间查询

时间:2013-06-03 19:09:00

标签: php sql-server tsql

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

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中编写一个查询,该查询将以特定间隔返回时间聚合的多列结果集?

2 个答案:

答案 0 :(得分:1)

尝试

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

ETC

然后根据需要汇总

SELECT
      VehicleID
      , SUM([Headlights on]) SUM([Headlights on],
FROM 
(
QUery above

) S
GROUP BY
VehicleID
, [Year]

答案 1 :(得分:1)

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帖子:How to group time by hour or by 10 minutes

编辑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。

为了使结果更像交叉表,我想你会想要按照你正在使用的时间聚合排序。希望有更多帮助。