Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MSSQL多列聚合时间查询_Php_Sql Server_Tsql - Fatal编程技术网

Php MSSQL多列聚合时间查询

Php MSSQL多列聚合时间查询,php,sql-server,tsql,Php,Sql Server,Tsql,在本例中,我正在收集一辆汽车的一些发动机数据 Variables -------------------------------------- id | name -------------------------------------- 1 Headlights On 2 Tire Pressure 3 Speed 4 Engine Runtime in Seconds ... Values ------------------------------

在本例中,我正在收集一辆汽车的一些发动机数据

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

试试看

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]
1分钟总计:

SELECT {edit: aggregate functions over fields here} FROM Values WHERE {blah} GROUP BY DATEPART (minute, time);
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);
5分钟总计:

SELECT {edit: aggregate functions over fields here} FROM Values WHERE {blah} GROUP BY DATEPART (minute, time);
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帖子:

编辑1: 对于“仅包含给定变量集的结果”部分,我的解释是您希望隔离变量id在指定集合内的值。如果您可以依赖变量数字/含义不变,那么常见的SQL解决方案是IN关键字()

这就是你要在上面的WHERE子句中添加的内容,例如

... WHERE var_id IN (2, 4) ...
如果您不能依赖于知道变量编号,但确定其名称,则可以使用子查询替换该集合,例如:

... WHERE var_id IN (SELECT id FROM Variables WHERE name IN ('Tire Pressure','Headlights On')) ...
另一种解释是,您实际上也希望基于变量ID进行聚合。在这种情况下,必须在GROUPBY子句中包含var_id


为了使结果更像交叉表,我想您需要按所使用的时间聚合排序。希望这能起到更大的帮助。

这给了我一些线索,但不是我真正想要的。查看我的示例中的表,我正在记录一组变量随时间变化的值。我不想总结一段时间内前照灯点亮的真实性,我想在一段时间间隔内以类似交叉表的格式显示提供的一组变量的值。这里有很多函数,如果你想让1为真(甚至多次),那么只需使用MAX(二进制列)或MAX(数字列EGTYREPRESSURE)。由(车辆ID和时间段)分组提供这正是你所要求的,因为我理解你的问题。这告诉我如何设置时间间隔,感谢帖子中的链接。这很有帮助。不过,我仍然不知道如何在我的问题中设置类似交叉表的结果集。它不像
WHERE{blah}那么简单
,我想。也许我的编辑会有所帮助。不过,我仍然不确定我对您要查找的内容的解释是否正确。这让我走上了正确的方向。我仍然在学习MSSQL。这个SQL查询给了我一个错误。因为我们是按时间分组的,
选择*
将产生“未包含在聚合函数中”错误。问题是,我不想包含它…max()、min()等在这里不相关-我只想知道该行在该时间的实际值。是的,这是真的,你完全正确。你需要在每个你想要的字段上使用一些聚合函数,除了你要聚合的字段,例如AVG(value)、min(var_id)这些行与原始表中的行没有直接对应关系,因此聚合“id”没有多大意义列。我猜在查询时没有超过13:20的数据,这意味着13:19聚合实际上是针对13:15、13:16、13:17、13:18和13:19的。13:14块似乎也正确,除非我遗漏了什么,而13:20只是一分钟的截断时间段。更正返回“特定时间间隔的时间聚合多列结果集"这不是问题。编写具有可变列名的查询是一个问题。执行所需操作需要动态SQL,因为列名存储在单独的表中。这真的是一个要求吗?我想可能是。我可以使用客户端应用程序从结果集生成多列表,但我现在还不想去那里我还没有开始开发我的客户端应用程序。只是在测试我的小OBD阅读器设备时,试图更好地了解数据库中的内容。