Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
Sql 在这个表中有没有按时间间隔分组的方法?_Sql_Sql Server 2008_Group By - Fatal编程技术网

Sql 在这个表中有没有按时间间隔分组的方法?

Sql 在这个表中有没有按时间间隔分组的方法?,sql,sql-server-2008,group-by,Sql,Sql Server 2008,Group By,我有一张这样的桌子: DateTime A 10:00:01 2 10:00:07 4 10:00:10 2 10:00:17 1 10:00:18 3 这是否可以创建一个查询,每10秒返回a的平均值?在这种情况下,结果将是: 3 (4+2)/2 2 (2+1+3)/3 提前谢谢 编辑:如果你真的认为这是不可能的,那就说不行这是一个可以接受的答案,我真的不知道这是否可以做到 编辑2:我正在使用SQL Server 2008。我想有不同的分组,但固定。例如,每10秒

我有一张这样的桌子:

DateTime   A

10:00:01   2 
10:00:07   4
10:00:10   2
10:00:17   1
10:00:18   3
这是否可以创建一个查询,每10秒返回a的平均值?在这种情况下,结果将是:

3 (4+2)/2
2 (2+1+3)/3
提前谢谢

编辑:如果你真的认为这是不可能的,那就说不行这是一个可以接受的答案,我真的不知道这是否可以做到


编辑2:我正在使用SQL Server 2008。我想有不同的分组,但固定。例如,每10秒、1分钟、5分钟、30分钟、1小时和1天的范围只是一个例子,但类似的情况可能会有人过来给你一个完整代码的答案,但我的方法是将其分解为几个较小的问题/解决方案:

1创建具有时间间隔的临时表。请参阅关于此问题的公认答案:

这个答案是针对MySQL的,但应该让您开始。通过谷歌搜索createinterval-SQL还应该产生实现这一点的其他方法。显然,您希望使用主表中的MAXDateTime和MINDateTime作为您所使用的任何方法的输入,而跨度为10秒

2将临时表与主表联接,联接条件为伪代码:

FROM mainTable m INNER JOIN #tempTable t ON m BETWEEN t.StartDate AND t.EndDate
3现在,它应该像正确选择和分组一样简单:

SELECT 
  AVG(m.A)     
FROM  
  mainTable m 
  INNER JOIN #tempTable t ON m BETWEEN t.StartDate AND t.EndDate 
GROUP BY 
  t.StartDate 
编辑:如果你想看到没有记录的区间平均值为零,你必须重新排列查询,使用左连接,并在m上合并。见下文。如果你不在乎看到这样的内部,OCary的解决方案会更好/更干净

SELECT 
  AVG(COALESCE(m.A, 0))
FROM  
  #tempTable t
  LEFT JOIN mainTable m ON m BETWEEN t.StartDate AND t.EndDate 
GROUP BY 
  t.StartDate 

这取决于您使用的DBMS。 在Oracle中,您可以执行以下操作:

SELECT AVG(A) 
FROM MYTABLE 
GROUP BY to_char(DateTime, 'HH24:MI') 

在SQL Server中,可以使用DATEPART,然后按小时、分钟和第二个整数除10进行分组

CREATE TABLE #times
(
    thetime time,
    A int
)

INSERT #times
VALUES ('10:00:01', 2)
INSERT #times
VALUES ('10:00:07', 4)
INSERT #times
VALUES ('10:00:10', 2)
INSERT #times
VALUES ('10:00:17', 1)
INSERT #times
VALUES ('10:00:18', 3)

SELECT avg(A)    --   <-- here you might deal with precision issues if you need non-integer results.  eg:  (avg(a * 1.0)
FROM #times
GROUP BY datepart(hour, thetime), DATEPART(minute, thetime), DATEPART(SECOND, thetime) / 10

DROP TABLE #times

我通过使用一个公共表表达式来获取我的数据的任何给定日期之间的所有周期来实现这一点。原则上,您可以将间隔更改为任何SQL间隔

DECLARE @interval_minutes INT = 5, @start_date DATETIME = '20130201', @end_date DATETIME = GETDATE()

;WITH cte_period AS
 (
    SELECT  CAST(@start_date AS DATETIME) AS [date]

    UNION ALL

     SELECT DATEADD(MINUTE, @interval_minutes, cte_period.[date]) AS [date]
     FROM cte_period
     WHERE DATEADD(MINUTE, @interval_minutes, cte_period.[date]) < @end_date
 )

, cte_intervals AS
 (SELECT [first].[date] AS [Start], [second].[date] AS [End] 
 FROM cte_period [first] 
 LEFT OUTER JOIN cte_period [second] ON DATEADD(MINUTE, 5, [first].[date]) = [second].[date]
  )

SELECT i.[Start], AVG(data)
FROM cte_intervals i
LEFT OUTER JOIN your_data mu ON mu.your_date_time >= i.Start and mu.your_date_time < i.[End]
GROUP BY i.[Start]
OPTION (MAXRECURSION 0)
从中,您还可以使用以下查询:

select dateadd(minute, datediff(minute, 0, timestamp ) / 10 * 10, 0), avg ( value )
from   yourtable
group by dateadd(minute, datediff(minute, 0, timestamp ) / 10 * 10, 0)
然后有人进一步提出:

Select
a.MyDate,
Start_of_10_Min =
dateadd(mi,(datepart(mi,a.MyDate)/10)*10,dateadd(hh,datediff(hh,0,a.Mydate),0))
from
( -- Test Data
select MyDate = getdate()
) a
虽然我不太清楚他们打算如何在第二个建议中获得平均分


就我个人而言,我更愿意知道那里发生了什么,并且我将能够在6个月内理解它,而无需再次查找,但为了完整性,我将这一项包括在内。

您使用的是什么RDBMS?而且你只需要x0-x9的固定分组?这些分组不以您的数据为条件?我希望有不同的分组,但是固定的。例如,每10秒、1分钟、5分钟、30分钟、1小时和1天的范围只是一个示例,但类似于这样的情况,您的数学示例结果与您的输入值不匹配。3在解释中,但不在输入值中。@OCary:对不起,你说得对,这是一个打字错误。现在它被修复了。你知道这是否可以翻译成Oracle吗?它是mysql,对不起,我写它的时间比你放在这里的upd稍早。我目前正在使用这种方法。感谢如果您所做的数据跨越1天、1个月或1年以上,请务必在相应的group by子句中添加数据,否则,每天1点、2点、3点等的数据将被分组为一组。按日期分组日期年份、时间、日期月份、时间、日期日期日期、时间、日期时间、日期时间、日期时间、日期时间分钟、时间、日期时间秒、时间/10非常好的观点@Ryanfescotland,你刚才解释并解决了我遇到的一个问题,总结的结果在所有情况下都不正确。谢谢好主意,不幸的是项目现在已经结束了。无论如何,谢谢你,我保留它以备将来参考。
select dateadd(minute, datediff(minute, 0, timestamp ) / 10 * 10, 0), avg ( value )
from   yourtable
group by dateadd(minute, datediff(minute, 0, timestamp ) / 10 * 10, 0)
Select
a.MyDate,
Start_of_10_Min =
dateadd(mi,(datepart(mi,a.MyDate)/10)*10,dateadd(hh,datediff(hh,0,a.Mydate),0))
from
( -- Test Data
select MyDate = getdate()
) a