0

在此示例中,我正在收集汽车的一些发动机数据。

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

4

2 回答 2

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]
于 2013-06-03T19:23:05.197 回答
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 帖子:如何按小时或按 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。

为了使结果更像交叉表,我想您需要按您正在使用的时间聚合进行排序。希望能帮助更多。

于 2013-06-03T19:25:47.500 回答