SQL前一条记录减后一条记录

飞雁 2009-07-11 04:02:38
设备数据表D_Data
ID 日期时间 区域 类型 编号 用户 用电量 用水量
1 2009-07-01 08:15:21.357 1 2 1 1 1 1
2 2009-07-01 08:16:03.483 1 2 1 2 1 2
3 2009-07-01 08:16:59.420 1 2 1 1 2 1
4 2009-07-01 08:17:53.623 1 2 1 1 3 2
5 2009-07-01 08:17:58.247 1 2 1 1 4 2
6 2009-07-01 08:17:59.450 1 2 1 1 5 3
7 2009-07-01 08:18:01.357 1 2 1 1 1 4
8 2009-07-01 08:18:02.780 1 2 2 2 3 6
9 2009-07-01 10:44:50.840 1 2 2 3 1 0
10 2009-07-01 10:45:03.950 1 2 1 1 6 4
11 2009-07-01 10:45:17.293 1 2 3 5 4 0
12 2009-07-01 10:45:30.577 1 2 1 5 5 0
13 2009-07-01 10:45:43.827 1 2 1 4 6 0
14 2009-07-01 10:45:57.030 1 2 2 7 7 0
15 2009-07-01 10:46:10.250 1 2 1 4 8 0
16 2009-07-01 10:46:23.873 1 2 3 9 9 0
17 2009-07-01 10:46:36.653 1 2 2 1 6 4
18 2009-07-01 10:46:53.500 1 2 3 2 4 8

设备状态表D_Status
ID 日期时间 区域 类型 编号 用户 状态(1表示设备开启,2表示设备关闭)
1 2009-07-01 08:17:06.577 1 2 1 1 1
2 2009-07-01 08:17:54.153 1 2 1 1 1
3 2009-07-01 08:17:58.450 1 2 1 1 1
4 2009-07-01 08:17:59.653 1 2 1 1 1
5 2009-07-01 08:18:01.577 1 2 1 1 1
6 2009-07-01 08:18:03.530 1 2 1 1 1
7 2009-07-01 10:44:44.437 1 2 2 2 2
8 2009-07-01 10:44:57.700 1 2 2 2 2
9 2009-07-01 10:45:10.937 1 2 2 1 2
10 2009-07-01 10:45:24.233 1 2 2 1 2
11 2009-07-01 10:45:37.437 1 2 2 3 2
12 2009-07-01 10:45:50.623 1 2 2 4 2
13 2009-07-01 10:46:03.937 1 2 2 2 2
14 2009-07-01 10:46:17.263 1 2 2 2 2
15 2009-07-01 10:46:30.437 1 2 2 2 2
16 2009-07-01 10:46:43.577 1 2 2 4 2

首先根据状态表中设备状态为1时的第一条记录为开始时间,设备状态为2时的第一条记录为结束时间(对每一个编号、用户和区域来说)查询数据表中数据信息。


[1]首先查询开始时间和结束时间:
比如:区域为1,编号为1,用户为1的第一条记录
设备启动时间:2009-07-01 08:17:06.577,设备停止时间:2009-07-01 10:45:10.937

[2]然后根据开始时间和结束时间查询对应的数据
比如:对应数据为:
2009-07-01 08:18:01.357 1 2 1 1 1 4
2009-07-01 10:45:03.950 1 2 1 1 6 4


这个SQL语句怎么写,还请大家多多帮忙啊?小弟是初来乍道的,多多指教,谢谢了!



...全文
472 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
---------------------------------
-- Author: HEROWANG(让你望见影子的墙)
-- Date : 2009-07-15 07:29:44
---------------------------------

IF OBJECT_ID('[D_Status]') IS NOT NULL
DROP TABLE [D_Status]
go
CREATE TABLE [D_Status] (ID INT,日期时间 DATETIME,区域 INT,类型 INT,编号 INT,用户 INT,状态 int)
INSERT INTO [D_Status]
SELECT 1,'2009-07-01 08:17:06.577',1,2,1,1,1 UNION ALL
SELECT 2,'2009-07-01 08:17:54.153',1,2,1,1,1 UNION ALL
SELECT 3,'2009-07-01 08:17:58.450',1,2,1,1,1 UNION ALL
SELECT 4,'2009-07-01 08:17:59.653',1,2,1,1,1 UNION ALL
SELECT 5,'2009-07-01 08:18:01.577',1,2,1,1,1 UNION ALL
SELECT 6,'2009-07-01 08:18:03.530',1,2,1,1,1 UNION ALL
SELECT 7,'2009-07-01 10:44:44.437',1,2,2,2,2 UNION ALL
SELECT 8,'2009-07-01 10:44:57.700',1,2,2,2,2 UNION ALL
SELECT 9,'2009-07-01 10:45:10.937',1,2,2,1,2 UNION ALL
SELECT 10,'2009-07-01 10:45:24.233',1,2,2,1,2 UNION ALL
SELECT 11,'2009-07-01 10:45:37.437',1,2,2,3,2 UNION ALL
SELECT 12,'2009-07-01 10:45:50.623',1,2,2,4,2 UNION ALL
SELECT 13,'2009-07-01 10:46:03.937',1,2,2,2,2 UNION ALL
SELECT 14,'2009-07-01 10:46:17.263',1,2,2,2,2 UNION ALL
SELECT 15,'2009-07-01 10:46:30.437',1,2,2,2,2 UNION ALL
SELECT 16,'2009-07-01 10:46:43.577',1,2,2,4,2

select * from [D_Status]
---------------------------------
-- Author: HEROWANG(让你望见影子的墙)
-- Date : 2009-07-15 07:30:07
---------------------------------

IF OBJECT_ID('[D_data]') IS NOT NULL
DROP TABLE [D_data]
go
CREATE TABLE [D_data] (ID INT,日期时间 DATETIME,区域 INT,类型 INT,编号 INT,用户 INT,用电量 INT,用水量 INT)
INSERT INTO [D_data]
SELECT 1,'2009-07-01 08:15:21.357',1,2,1,1,1,1 UNION ALL
SELECT 2,'2009-07-01 08:16:03.483',1,2,1,2,1,2 UNION ALL
SELECT 3,'2009-07-01 08:16:59.420',1,2,1,1,2,1 UNION ALL
SELECT 4,'2009-07-01 08:17:53.623',1,2,1,1,3,2 UNION ALL
SELECT 5,'2009-07-01 08:17:58.247',1,2,1,1,4,2 UNION ALL
SELECT 6,'2009-07-01 08:17:59.450',1,2,1,1,5,3 UNION ALL
SELECT 7,'2009-07-01 08:18:01.357',1,2,1,1,1,4 UNION ALL
SELECT 8,'2009-07-01 08:18:02.780',1,2,2,2,3,6 UNION ALL
SELECT 9,'2009-07-01 10:44:50.840',1,2,2,3,1,0 UNION ALL
SELECT 10,'2009-07-01 10:45:03.950',1,2,1,1,6,4 UNION ALL
SELECT 11,'2009-07-01 10:45:17.293',1,2,3,5,4,0 UNION ALL
SELECT 12,'2009-07-01 10:45:30.577',1,2,1,5,5,0 UNION ALL
SELECT 13,'2009-07-01 10:45:43.827',1,2,1,4,6,0 UNION ALL
SELECT 14,'2009-07-01 10:45:57.030',1,2,2,7,7,0 UNION ALL
SELECT 15,'2009-07-01 10:46:10.250',1,2,1,4,8,0 UNION ALL
SELECT 16,'2009-07-01 10:46:23.873',1,2,3,9,9,0 UNION ALL
SELECT 17,'2009-07-01 10:46:36.653',1,2,2,1,6,4 UNION ALL
SELECT 18,'2009-07-01 10:46:53.500',1,2,3,2,4,8

select * from [D_data]
;
with
wang
as(
select 区域,类型,用户,开始时间=min(case when 状态=1 then 日期时间 end),终止时间=min(case when 状态=2 then 日期时间 end) from d_status t group by 区域,类型,用户
),
wang1
as(
select top 2 t.* from wang s ,d_data t where s.区域=t.区域 and s.类型=t.类型 and s.用户=t.用户
and 开始时间 is not null
and (日期时间 between 开始时间 and 终止时间)
)

select * from wang1 order by 日期时间 desc

ID 日期时间 区域 类型 编号 用户 用电量 用水量
10 2009-07-01 10:45:03.950 1 2 1 1 6 4
7 2009-07-01 08:18:01.357 1 2 1 1 1 4
soudog 2009-07-14
  • 打赏
  • 举报
回复
我把LZ的意思理解成这样:根据指定的区域,编号,用户查出设备数据表D_Data中对应的数据。
思路大概如此:
1. 从D_Data表中根据区域,编号,用户查询对应的数据,假设查询的数据集合为A
2. 从D_Status表根据中区域,编号,用户查询对应的数据,假设查询的数据集合为B
3. 对A和B进行自然连接,假设结果为C
4. 对C进行自连接,建设结果为D
5. 查询D中A.日期时间 大于 B.日期时间的数据

select distinct *
from
( select A.日期时间 as A日期时间,B.日期时间 as B日期时间,...
from (select * from D_Data where ...) A,(select * from D_Status where ...) B
)C,C
where B日期时间>A日期时间
linguojin11 2009-07-14
  • 打赏
  • 举报
回复
(select 区域,编号,用户,min(日期时间) from D_Status where 状态=1 group by 区域,编号,用户)a
inner join
(select 区域,编号,用户,min(日期时间) from D_Status where 状态=2 group by 区域,编号,用户)b
---------
用这两个表做连接应该可以了
plglenn7 2009-07-14
  • 打赏
  • 举报
回复
d
ChinaJiaBing 2009-07-11
  • 打赏
  • 举报
回复

select a.字段-b.字段 from 表1 a full join 表1 b on a.id=b.id-1
rucypli 2009-07-11
  • 打赏
  • 举报
回复
设置一个identity列 id


select
from tb a,tb b
where a.id=b.id+1
feixianxxx 2009-07-11
  • 打赏
  • 举报
回复
你到底想做什么啊
JonasFeng 2009-07-11
  • 打赏
  • 举报
回复
交叉表。
自连接。

34,576

社区成员

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

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