在这个例子中,我正在收集一辆汽车的一些引擎数据。
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]