Sql 使用两个分组值,一次取三条记录的滚动平均值
我处理的数据没有主键,而是按TMC值和日期值分组。我想做的是取5分钟的历元值,然后将它们平均一次三条记录合并成一个15分钟的历元。所以历元0,1,2一起平均得到一个新记录,然后是3,4,5,依此类推。这是一张样品表。我不知道如何正确格式化此文件: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 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分钟,这是行不通的。因此,这种排序应该是我努力的目标: