求如何计算某时间段的平均值呢?

MrGG 2015-08-21 12:22:01
我的原始数据是2分钟一条数据,想求5分钟,10分钟。。。等等可选择时间段的,之内的平均值

原始数据:
InterfaceID DateTime In_Averagebps
991 2015-06-22 00:01:46.000 1242305
991 2015-06-22 00:03:46.997 1326974
991 2015-06-22 00:05:46.997 1074069
991 2015-06-22 00:07:47.000 1290775
991 2015-06-22 00:09:48.997 1204597
991 2015-06-22 00:11:48.997 943425.3
991 2015-06-22 00:13:50.000 1045493
991 2015-06-22 00:15:50.000 1017358
991 2015-06-22 00:17:50.997 1490217
991 2015-06-22 00:19:49.997 1281273
991 2015-06-22 00:21:49.997 1538141
991 2015-06-22 00:23:51.000 1563413
991 2015-06-22 00:25:55.000 1517572
991 2015-06-22 00:27:55.000 1612961
991 2015-06-22 00:29:58.000 1811118
991 2015-06-22 00:31:56.997 1807192
991 2015-06-22 00:33:58.000 1761714
991 2015-06-22 00:35:58.000 1655595
991 2015-06-22 00:37:57.997 1548015
991 2015-06-22 00:40:01.000 1564148
991 2015-06-22 00:42:00.000 1433731
991 2015-06-22 00:44:00.997 972750.4
991 2015-06-22 00:46:03.000 1173996
991 2015-06-22 00:48:00.997 1185221

select出来以后的数据希望是下面这样的
InterfaceID DateTime In_Averagebps
991 2015-06-22 00:00:00 ???
991 2015-06-22 00:05:00 ???
991 2015-06-22 00:10:00 ???
........
这样的sql语句如何写呢

谢谢
...全文
2061 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2015-08-24
  • 打赏
  • 举报
回复
把时间搞成段,然后再group by 如按每小时 group by year(dt),moth(dt),day(dt),DATEPART(hh,dt)
Tiger_Zhao 2015-08-21
  • 打赏
  • 举报
回复
再加个参数进来: (1440*@days/@splitMinutes)
MrGG 2015-08-21
  • 打赏
  • 举报
回复
多谢多谢 很好用, 但日期也不是只有一天的 变量可以设置结果从哪一天到哪一天的如何写呢
道玄希言 2015-08-21
  • 打赏
  • 举报
回复



;with cte as
(
select (convert(nvarchar(14), [DateTime], 120) + (case 
when datepart(Minute, [DateTime])< 5 then '00:00'
when datepart(Minute, [DateTime])< 10 then '05:00'
when datepart(Minute, [DateTime])< 15 then '10:00'
when datepart(Minute, [DateTime])< 20 then '15:00'
when datepart(Minute, [DateTime])< 25 then '20:00'
when datepart(Minute, [DateTime])< 30 then '25:00'
when datepart(Minute, [DateTime])< 35 then '30:00'
when datepart(Minute, [DateTime])< 40 then '35:00'
when datepart(Minute, [DateTime])< 45 then '40:00'
when datepart(Minute, [DateTime])< 50 then '45:00'
when datepart(Minute, [DateTime])< 55 then '50:00'
when datepart(Minute, [DateTime])< 60 then '55:00' end)) as newdt,
InterfaceID, In_Averagebps
from tbl 
-- where [DateTime] >= '2015-06-01' and [DateTime] < '2015-08-01' -- 时间段条件 
)
select newdt, InterfaceID, avg(In_Averagebps) from cte group by newdt, InterfaceID



Tiger_Zhao 2015-08-21
  • 打赏
  • 举报
回复
DECLARE @date datetime
DECLARE @splitMinutes int
SET @date = '2015-06-22'
SET @splitMinutes = 5

;WITH /* 测试数据
table1(InterfaceID,[DateTime],In_Averagebps) AS (
SELECT 991,'2015-06-22 00:01:46.000',1242305 UNION ALL
SELECT 991,'2015-06-22 00:03:46.997',1326974 UNION ALL
SELECT 991,'2015-06-22 00:05:46.997',1074069 UNION ALL
SELECT 991,'2015-06-22 00:07:47.000',1290775 UNION ALL
SELECT 991,'2015-06-22 00:09:48.997',1204597 UNION ALL
SELECT 991,'2015-06-22 00:11:48.997',943425.3 UNION ALL
SELECT 991,'2015-06-22 00:13:50.000',1045493 UNION ALL
SELECT 991,'2015-06-22 00:15:50.000',1017358 UNION ALL
SELECT 991,'2015-06-22 00:17:50.997',1490217 UNION ALL
SELECT 991,'2015-06-22 00:19:49.997',1281273 UNION ALL
SELECT 991,'2015-06-22 00:21:49.997',1538141 UNION ALL
SELECT 991,'2015-06-22 00:23:51.000',1563413 UNION ALL
SELECT 991,'2015-06-22 00:25:55.000',1517572 UNION ALL
SELECT 991,'2015-06-22 00:27:55.000',1612961 UNION ALL
SELECT 991,'2015-06-22 00:29:58.000',1811118 UNION ALL
SELECT 991,'2015-06-22 00:31:56.997',1807192 UNION ALL
SELECT 991,'2015-06-22 00:33:58.000',1761714 UNION ALL
SELECT 991,'2015-06-22 00:35:58.000',1655595 UNION ALL
SELECT 991,'2015-06-22 00:37:57.997',1548015 UNION ALL
SELECT 991,'2015-06-22 00:40:01.000',1564148 UNION ALL
SELECT 991,'2015-06-22 00:42:00.000',1433731 UNION ALL
SELECT 991,'2015-06-22 00:44:00.997',972750.4 UNION ALL
SELECT 991,'2015-06-22 00:46:03.000',1173996 UNION ALL
SELECT 991,'2015-06-22 00:48:00.997',1185221
) */
,a AS (
SELECT DATEADD(minute,@splitMinutes * number,@date) dt1,
DATEADD(minute,@splitMinutes * (number+1),@date) dt2
FROM master..spt_values
WHERE type = 'p'
AND number < (1440/@splitMinutes)
),
b AS (
SELECT DISTINCT InterfaceID
FROM table1
)
SELECT b.InterfaceID,
a.dt1 [Datetime],
AVG(t.In_Averagebps) In_Averagebps
FROM a
JOIN b
ON 1=1
LEFT JOIN table1 t
ON b.InterfaceID = t.InterfaceID
AND t.[Datetime] >= a.dt1
AND t.[Datetime] < a.dt2
GROUP BY b.InterfaceID, a.dt1
ORDER BY b.InterfaceID, a.dt1

InterfaceID Datetime                                          In_Averagebps
----------- ----------------------- ---------------------------------------
991 2015-06-22 00:00:00.000 1284639.500000
991 2015-06-22 00:05:00.000 1189813.666666
991 2015-06-22 00:10:00.000 994459.150000
991 2015-06-22 00:15:00.000 1262949.333333
991 2015-06-22 00:20:00.000 1550777.000000
991 2015-06-22 00:25:00.000 1647217.000000
991 2015-06-22 00:30:00.000 1784453.000000
991 2015-06-22 00:35:00.000 1601805.000000
991 2015-06-22 00:40:00.000 1323543.133333
991 2015-06-22 00:45:00.000 1179608.500000
991 2015-06-22 00:50:00.000 NULL
...
991 2015-06-22 23:55:00.000 NULL

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧