在这个例子中,我正在汽车上收集一些引擎数据。
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中编写一个查询,该查询将以特定间隔返回时间聚合的多列结果集?
答案 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。
为了使结果更像交叉表,我想你会想要按照你正在使用的时间聚合排序。希望有更多帮助。