按照 间隔时间 来获取表中数据

__小龙虾__ 2016-11-22 01:07:49
设备表
PID PName
1 设备1
2 设备2
3 设备3


记录表 (一分钟一条数据,秒可以忽略)
ID PID PData DTTime
1 1 50 2016-11-21 16:01:42.000
2 2 58 2016-11-21 16:01:31.000
3 1 27 2016-11-21 16:02:23.000
4 2 30 2016-11-21 16:02:35.000
5 1 22 2016-11-21 16:03:03.000
6 2 31 2016-11-21 16:03:22.000
7 3 28 2016-11-21 16:03:13.000
8 1 45 2016-11-21 16:04:14.000
9 2 67 2016-11-21 16:04:26.000
10 3 29 2016-11-21 16:04:51.000
11 1 66 2016-11-21 16:05:13.000
12 2 39 2016-11-21 16:05:46.000
13 3 18 2016-11-21 16:05:14.000
14 1 57 2016-11-21 16:06:33.000
15 2 42 2016-11-21 16:06:02.000
16 1 23 2016-11-21 16:07:26.000
17 2 53 2016-11-21 16:07:25.000

1.设备表 设备是动态的,可能更多

2.记录表 一个设备一分钟一条数据(间隔),并不一定是每分钟都有数据

现在如果按照>=2分钟间隔区取记录(秒忽略),结果如下:

ID PID PData DTTime
1 1 50 2016-11-21 16:01:42.000
2 2 58 2016-11-21 16:01:31.000
5 1 22 2016-11-21 16:03:03.000
6 2 31 2016-11-21 16:03:22.000
7 3 28 2016-11-21 16:03:13.000
11 1 66 2016-11-21 16:05:13.000
12 2 39 2016-11-21 16:05:46.000
13 3 18 2016-11-21 16:05:14.000
16 1 23 2016-11-21 16:07:26.000
17 2 53 2016-11-21 16:07:25.000


这里间隔时间也要动态起来
...全文
408 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
szhourj2 2016-11-23
  • 打赏
  • 举报
回复
已测试,构造很大的数据量,上面一条SQL就显示结果的方法不适用
szhourj2 2016-11-23
  • 打赏
  • 举报
回复
觉得方法很巧妙,但也有疑惑:试想,如果资料量足够的大,显示的资料中前面部分使用的GETDATE()与后面部分使用的GETDATE()已经发生变化会不会影响了此例中的结果了??? 另附上自己写的,应该没毛病,但方法显得蠢笨(总觉得也可以用一条SQL显示结果的,但测试总不成功,最后只有用游标了) --建表 create table 记录表 ( id int identity(1,1) primary key, pid int, pdata int. dttime datetime ) --存储过程 create procedure p_记录表 as declare @temp table( id int, pid int, pdata int, dttime datetime ) declare @id int,@id2 int declare @pid int,@pid2 int declare @pdata int,@pdata2 int declare @dttime datetime,@dttime2 datetime declare @cnt int declare cur_test cursor for select * from 记录表 open cur_test fetch next FROM cur_test into @id,@pid,@pdata,@dttime while @@FETCH_STATUS=0 begin if (exists(select * from @temp where pid=@pid and DATEDIFF(mi,dttime,@dttime)>=2 and id=(select MAX(id) from @temp where pid=@pid) )) or (not exists(select * from @temp where pid=@pid)) insert into @temp values(@id,@pid,@pdata,@dttime) fetch next FROM cur_test into @id,@pid,@pdata,@dttime end close cur_test deallocate cur_test select * from @temp ---查看结果 exec p_记录表
引用 楼主 qq_17520411 的回复:
设备表 PID PName 1 设备1 2 设备2 3 设备3 记录表 (一分钟一条数据,秒可以忽略) ID PID PData DTTime 1 1 50 2016-11-21 16:01:42.000 2 2 58 2016-11-21 16:01:31.000 3 1 27 2016-11-21 16:02:23.000 4 2 30 2016-11-21 16:02:35.000 5 1 22 2016-11-21 16:03:03.000 6 2 31 2016-11-21 16:03:22.000 7 3 28 2016-11-21 16:03:13.000 8 1 45 2016-11-21 16:04:14.000 9 2 67 2016-11-21 16:04:26.000 10 3 29 2016-11-21 16:04:51.000 11 1 66 2016-11-21 16:05:13.000 12 2 39 2016-11-21 16:05:46.000 13 3 18 2016-11-21 16:05:14.000 14 1 57 2016-11-21 16:06:33.000 15 2 42 2016-11-21 16:06:02.000 16 1 23 2016-11-21 16:07:26.000 17 2 53 2016-11-21 16:07:25.000 1.设备表 设备是动态的,可能更多 2.记录表 一个设备一分钟一条数据(间隔),并不一定是每分钟都有数据 现在如果按照>=2分钟间隔区取记录(秒忽略),结果如下: ID PID PData DTTime 1 1 50 2016-11-21 16:01:42.000 2 2 58 2016-11-21 16:01:31.000 5 1 22 2016-11-21 16:03:03.000 6 2 31 2016-11-21 16:03:22.000 7 3 28 2016-11-21 16:03:13.000 11 1 66 2016-11-21 16:05:13.000 12 2 39 2016-11-21 16:05:46.000 13 3 18 2016-11-21 16:05:14.000 16 1 23 2016-11-21 16:07:26.000 17 2 53 2016-11-21 16:07:25.000 这里间隔时间也要动态起来
shoppo0505 2016-11-22
  • 打赏
  • 举报
回复
引用 1 楼 timefile 的回复:



-- =============================================
-- Author: JackChan
-- Create date:  <Create Date, ,>
-- Description:	 <Description, ,>
-- =============================================
USE tempdb
GO

if object_id('[Tb_PInfo]') is not null drop table [Tb_PInfo]
go 
create table Tb_PInfo([ID] int identity(1,1),[PARTNAME] varchar(20))
insert [Tb_PInfo]
select '设备1' union all
select '设备2' union all
select '设备3' 
GO

if object_id('[Tb_PDataList]') is not null drop table [Tb_PDataList]
go 
create table Tb_PDataList([ID] int identity(1,1),[PID] INT,[Pdata] INT ,DTTime DATETIME)
insert [Tb_PDataList]
SELECT  1,50,'2016-11-21 16:01:42.000' UNION all
SELECT  2,58,'2016-11-21 16:01:31.000' UNION all
SELECT  1,27,'2016-11-21 16:02:23.000' UNION all
SELECT  2,30,'2016-11-21 16:02:35.000' UNION all
SELECT  1,22,'2016-11-21 16:03:03.000' UNION all
SELECT  2,31,'2016-11-21 16:03:22.000' UNION all 
SELECT  3,28,'2016-11-21 16:03:13.000' UNION all
SELECT  1,45,'2016-11-21 16:04:14.000' UNION all 
SELECT  2,67,'2016-11-21 16:04:26.000' UNION all
SELECT  3,29,'2016-11-21 16:04:51.000' UNION all
SELECT  1,66,'2016-11-21 16:05:13.000' UNION all
SELECT  2,39,'2016-11-21 16:05:46.000' UNION all 
SELECT  3,18,'2016-11-21 16:05:14.000' UNION all
SELECT  1,57,'2016-11-21 16:06:33.000' UNION all 
SELECT  2,42,'2016-11-21 16:06:02.000' UNION all
SELECT  1,23,'2016-11-21 16:07:26.000' UNION all 
SELECT  2,53,'2016-11-21 16:07:25.000'
GO
SELECT * FROM Tb_PInfo AS tp
SELECT * FROM Tb_PDataList AS tpl

--从首条数据计算2分钟时间差,时间向前2分钟;当期时间分钟的基偶影响结果集做下处理
Select ID,PID,Pdata,DTTime FROM   
(SELECT ID,PID,Pdata,DTTime, 
datediff(mi,DTTime,DATEADD(mi,-2,CASE WHEN DATEPART(mi,GETDATE())%2=0 THEN DATEADD(mi,1,GETDATE()) ELSE GETDATE()END)) AS interval    
FROM Tb_PDataList ) AS t WHERE t.interval%2 = 0




好方法,学习了。 我在尝试用递归,但是太复杂了,头晕。
中国风 2016-11-22
  • 打赏
  • 举报
回复
以第1条记录的最小时间为准2分钟为一个单位 e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[PID] int,[PData] int,[DTTime] Datetime)
Insert #T
select 1,1,50,'2016-11-21 16:01:42.000' union all
select 2,2,58,'2016-11-21 16:01:31.000' union all
select 3,1,27,'2016-11-21 16:02:23.000' union all
select 4,2,30,'2016-11-21 16:02:35.000' union all
select 5,1,22,'2016-11-21 16:03:03.000' union all
select 6,2,31,'2016-11-21 16:03:22.000' union all
select 7,3,28,'2016-11-21 16:03:13.000' union all
select 8,1,45,'2016-11-21 16:04:14.000' union all
select 9,2,67,'2016-11-21 16:04:26.000' union all
select 10,3,29,'2016-11-21 16:04:51.000' union all
select 11,1,66,'2016-11-21 16:05:13.000' union all
select 12,2,39,'2016-11-21 16:05:46.000' union all
select 13,3,18,'2016-11-21 16:05:14.000' union all
select 14,1,57,'2016-11-21 16:06:33.000' union all
select 15,2,42,'2016-11-21 16:06:02.000' union all
select 16,1,23,'2016-11-21 16:07:26.000' union all
select 17,2,53,'2016-11-21 16:07:25.000'
Go
Select * FROM #T WHERE DATEPART(n,[DTTime])%2=DATEPART(n,(SELECT MIN([DTTime]) FROM #T))%2

/*
ID	PID	PData	DTTime
1	1	50	2016-11-21 16:01:42.000
2	2	58	2016-11-21 16:01:31.000
5	1	22	2016-11-21 16:03:03.000
6	2	31	2016-11-21 16:03:22.000
7	3	28	2016-11-21 16:03:13.000
11	1	66	2016-11-21 16:05:13.000
12	2	39	2016-11-21 16:05:46.000
13	3	18	2016-11-21 16:05:14.000
16	1	23	2016-11-21 16:07:26.000
17	2	53	2016-11-21 16:07:25.000
*/

寡亾 2016-11-22
  • 打赏
  • 举报
回复



-- =============================================
-- Author: JackChan
-- Create date:  <Create Date, ,>
-- Description:	 <Description, ,>
-- =============================================
USE tempdb
GO

if object_id('[Tb_PInfo]') is not null drop table [Tb_PInfo]
go 
create table Tb_PInfo([ID] int identity(1,1),[PARTNAME] varchar(20))
insert [Tb_PInfo]
select '设备1' union all
select '设备2' union all
select '设备3' 
GO

if object_id('[Tb_PDataList]') is not null drop table [Tb_PDataList]
go 
create table Tb_PDataList([ID] int identity(1,1),[PID] INT,[Pdata] INT ,DTTime DATETIME)
insert [Tb_PDataList]
SELECT  1,50,'2016-11-21 16:01:42.000' UNION all
SELECT  2,58,'2016-11-21 16:01:31.000' UNION all
SELECT  1,27,'2016-11-21 16:02:23.000' UNION all
SELECT  2,30,'2016-11-21 16:02:35.000' UNION all
SELECT  1,22,'2016-11-21 16:03:03.000' UNION all
SELECT  2,31,'2016-11-21 16:03:22.000' UNION all 
SELECT  3,28,'2016-11-21 16:03:13.000' UNION all
SELECT  1,45,'2016-11-21 16:04:14.000' UNION all 
SELECT  2,67,'2016-11-21 16:04:26.000' UNION all
SELECT  3,29,'2016-11-21 16:04:51.000' UNION all
SELECT  1,66,'2016-11-21 16:05:13.000' UNION all
SELECT  2,39,'2016-11-21 16:05:46.000' UNION all 
SELECT  3,18,'2016-11-21 16:05:14.000' UNION all
SELECT  1,57,'2016-11-21 16:06:33.000' UNION all 
SELECT  2,42,'2016-11-21 16:06:02.000' UNION all
SELECT  1,23,'2016-11-21 16:07:26.000' UNION all 
SELECT  2,53,'2016-11-21 16:07:25.000'
GO
SELECT * FROM Tb_PInfo AS tp
SELECT * FROM Tb_PDataList AS tpl

--从首条数据计算2分钟时间差,时间向前2分钟;当期时间分钟的基偶影响结果集做下处理
Select ID,PID,Pdata,DTTime FROM   
(SELECT ID,PID,Pdata,DTTime, 
datediff(mi,DTTime,DATEADD(mi,-2,CASE WHEN DATEPART(mi,GETDATE())%2=0 THEN DATEADD(mi,1,GETDATE()) ELSE GETDATE()END)) AS interval    
FROM Tb_PDataList ) AS t WHERE t.interval%2 = 0




34,590

社区成员

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

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