每三钟统计一组数据

awjx 2006-08-08 03:38:27
有表如下:
T_Data(DataTime,Press,Flux)

系统每分钟保存一条记录,现需得到如下结果:
每三钟的平均Press,与该三钟的最后一个Flux,作为一条记录保存到另一张表,该条记录的时间也是取三条中的最后一条。
求此SQL!

实例如:
DataTime Press Flux
2006-8-8 15:24:00 35 2342
2006-8-8 15:25:00 23 3456
2006-8-8 15:26:00 565 345
2006-8-8 15:27:00 37 634
2006-8-8 15:28:00 98 234
2006-8-8 15:29:00 2 437
2006-8-8 15:30:00 354 3653
2006-8-8 15:31:00 66 21341
2006-8-8 15:32:00 67 134
2006-8-8 15:33:00 875 2352
2006-8-8 15:34:00 355 2452
2006-8-8 15:35:00 35 23452
2006-8-8 15:36:00 385 2452
2006-8-8 15:37:00 35 2435234

即24-26分钟的数据统计为一条
27-29分钟的数据统计为一条,

不知我说清楚了没有?

急求,谢谢!

...全文
164 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
awjx 2006-08-10
  • 打赏
  • 举报
回复
但是各位高人的方法都不能在Access使用。

在Access下怎么写这条语句呢?






















mustudent 2006-08-08
  • 打赏
  • 举报
回复
O
paoluo 2006-08-08
  • 打赏
  • 举报
回复
那如果確保每分鐘都會有紀錄的話,就用Yang_(扬帆破浪) 的借用臨時表的方法吧。
awjx 2006-08-08
  • 打赏
  • 举报
回复
如果最后只两条数据,则最后两条不参与统计!
因为可以理解为最后三分钟还未到。
Yang_ 2006-08-08
  • 打赏
  • 举报
回复
注意到了,两个区别
1、如果最後一組只有一兩條紀錄,我的方法会丢弃
2、如果缺了记录,我的按每3条分组,鱼的按每3分钟分组

具体取舍看楼主需要,对这两种情况楼主都没说明
paoluo 2006-08-08
  • 打赏
  • 举报
回复
如果最後一組只有兩條紀錄,Yang_(扬帆破浪)的就沒有進行統計了。

加自增列,的確可以簡化不少。
Yang_ 2006-08-08
  • 打赏
  • 举报
回复
--改下错

select * ,IDENTITY(int,0,1) as id
into #t
from T_Data
order by DataTime

select (select avg(Press) from #t where id / 3=a.id /3) as avgPress, Flux
from #t a
where id % 3=2

drop table #t

--结果
avgPress Flux
----------- -----------
207 345
45 437
162 134
421 23452

(所影响的行数为 4 行)

Yang_ 2006-08-08
  • 打赏
  • 举报
回复
select * ,IDENTITY(int,0,1) as id
into #t
from T_Data
where ......
order by DataTime
Press Flux

select (select avg(Press) from #t where id \ 3=a.id \3) as avgPress, Flux
from #t
where id % 3=2

drop table #t
paoluo 2006-08-08
  • 打赏
  • 举报
回复
這裡的Press是用Avg得出的,不知道是不是你想要的,你測試下。
paoluo 2006-08-08
  • 打赏
  • 举报
回复
Create Table T_Data(DataTime DateTime,Press Int,Flux Int)
Insert T_Data Select '2006-8-8 15:24:00', 35, 2342
Union All Select '2006-8-8 15:25:00', 23, 3456
Union All Select '2006-8-8 15:26:00', 565, 345
Union All Select '2006-8-8 15:27:00', 37, 634
Union All Select '2006-8-8 15:28:00', 98, 234
Union All Select '2006-8-8 15:29:00', 2, 437
Union All Select '2006-8-8 15:30:00', 354, 3653
Union All Select '2006-8-8 15:31:00', 66, 21341
Union All Select '2006-8-8 15:32:00', 67, 134
Union All Select '2006-8-8 15:33:00', 875, 2352
Union All Select '2006-8-8 15:34:00', 355, 2452
Union All Select '2006-8-8 15:35:00', 35, 23452
Union All Select '2006-8-8 15:36:00', 385, 2452
Union All Select '2006-8-8 15:37:00', 35, 2435234
GO
Declare @MinDataTime DateTime
Select @MinDataTime=Min(DataTime) From T_Data
Select
A.DataTime,
B.Press,
A.Flux
From T_Data A
Inner Join
(Select
Avg(Press) As Press,
Max(DataTime) As DataTime
From T_Data
Group By DateDiff(mi,@MinDataTime,DataTime)/3) B
On A.DataTime=B.DataTime
GO
Drop Table T_Data
/*
DataTime Press Flux
2006-08-08 15:26:00.000 207 345
2006-08-08 15:29:00.000 45 437
2006-08-08 15:32:00.000 162 134
2006-08-08 15:35:00.000 421 23452
2006-08-08 15:37:00.000 210 2435234
*/

34,576

社区成员

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

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