Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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_Grouping_Average - Fatal编程技术网

Sql 使用两个分组值,一次取三条记录的滚动平均值

Sql 使用两个分组值,一次取三条记录的滚动平均值,sql,sql-server,grouping,average,Sql,Sql Server,Grouping,Average,我处理的数据没有主键,而是按TMC值和日期值分组。我想做的是取5分钟的历元值,然后将它们平均一次三条记录合并成一个15分钟的历元。所以历元0,1,2一起平均得到一个新记录,然后是3,4,5,依此类推。这是一张样品表。我不知道如何正确格式化此文件: TMC DATE EPOCH TRAVEL_TIME_ALL_VEHICLES 113N04415 1012016 0 228 113N04415 1012016 1 228 113N04415

我处理的数据没有主键,而是按TMC值和日期值分组。我想做的是取5分钟的历元值,然后将它们平均一次三条记录合并成一个15分钟的历元。所以历元0,1,2一起平均得到一个新记录,然后是3,4,5,依此类推。这是一张样品表。我不知道如何正确格式化此文件:

TMC         DATE    EPOCH   TRAVEL_TIME_ALL_VEHICLES
113N04415   1012016 0       228
113N04415   1012016 1       228
113N04415   1012016 2       222
113N04415   1012016 3       224
113N04415   1012016 4       229
113N04415   1012016 5       223
我想我对这段代码很熟悉,因为它对第一条记录有效,但对第二条记录无效:

select tmc, date, avg(Travel_TIME_ALL_VEHICLES) AS TRAVEL_avg
from (select I40_2016_ALL.*, 
             row_number() over (order by TMC, date, epoch) as rn 
      from I40_2016_ALL) I40_2016_ALL
where tmc = '113n04415' and date = '1012016'
group by TMC, DATE, floor((rn - 1) / 3)
ORDER BY TMC, DATE

可以像这样使用整数除法:

SELECT TMC, [DATE], EPOCH, AVG(TRAVEL_TIME_ALL_VEHICLES) AS TRAVEL_avg       
FROM (
   SELECT TMC, [DATE], TRAVEL_TIME_ALL_VEHICLES,
          ROW_NUMBER() OVER (ORDER BY TMC, [DATE], EPOCH) AS rn
   FROM I40_2016_ALL) AS t
GROUP BY TMC, [DATE], (rn -1)/ 3
ORDER BY TMC, [DATE]
此查询将行
1,2,3
放在一个组中,将行
4,5,6
放在下一个组中,等等。

类似于:

SELECT AVG(TRAVEL_TIME_ALL_VEHICLES) 
FROM
(
SELECT TRAVEL_TIME_ALL_VEHICLES AS TRAVEL_TIME_ALL_VEHICLES
,(ROW_NUMBER() OVER (Order by EPOCH) + 2)/3 AS GroupID
FROM
YourTable
) AS d
GROUP BY d.GroupID

嗯,我没试过这个,但是:

    select tmc, date, floor((epoch + 1) / 3) as part, 
           avg(Travel_TIME_ALL_VEHICLES) AS TRAVEL_avg
      from I40_2016_ALL
     where tmc = '113n04415' and date = '1012016'
     group by TMC, DATE, floor((epoch + 1) / 3)
或者如果你想让每一行都有总数

        select tmc, date, floor((epoch + 1) / 3) as part, 
               avg(Travel_TIME_ALL_VEHICLES) 
                over (partition by TMC, DATE, floor((epoch + 1) / 3)) AS TRAVEL_avg
          from I40_2016_ALL
         where tmc = '113n04415' and date = '1012016'

请用您实际使用的RDBMS标记您的问题。MySQL还没有实现像
row\u number
afaik.RDBMS这样的窗口功能?“我使用的是microsoft sql server management studio。它什么也没做,只是显示了普通的记录。”BenZeddicus表示歉意。我无意中将
EPOCH
字段包含在
groupby
子句中。请检查我所做的编辑。这是有效的,但订购的地方到处都是。我需要它按tmc和日期排列。@BenZeddicus然后添加一个
orderby
子句。Msg 207,16级,状态1,第6行无效列名“RANK”。Msg 4108,第15级,状态1,第6行窗口函数只能出现在SELECT或ORDER BY子句中。很抱歉,我删除了排名,替换为EPOCHOSTILL。窗口函数出现错误,只能出现在SELECT或ORDER BY子句中。您确定吗?我已将其从内部selectMsg 2809,第16级,状态1,第7行删除。过程“I40_2016_ALL”的请求失败,因为“I40_2016_ALL”是一个表对象。其中没有FROM子句。更好的是,分段被一个关闭。前两条记录是自己的,最后一条记录是自己的。我认为这是因为总共有287条记录。所以某个地方只有2条记录被平均。我通过从历代中删除+1来更正您的代码,这发现了另一个问题。历元值不一致,因为编号中存在间隙。这可以在第21部分看到,其中缺少纪元64。有办法纠正吗?是的,你是对的,“+1”必须去。。。让我明白,你想按3组物理记录或3组连续“历元”对它们进行分组吗?所以(0,1,2),(3,4,5),(6,7,8),(9,11),(12,13,14)加在一起,即使少了10个?或者(0,1,2),(3,4,5),(6,7,8),(9,11,12),(13,14),这将是物理行数?是的,只要各纪元不丢失记录,我们已经达到了排序有效的程度。他们就是这样。所以有些片段的平均时间是5分钟或10分钟,这是行不通的。因此,这种排序应该是我努力的目标: