日期:2014-05-18 浏览次数:20495 次
create table tb(id int,类型 varchar(10),时间 varchar(10),甲线石灰石 int,乙线石灰石 int,脱硫电量 int) insert into tb select 1,'k','06:30:30',4545,21,23 insert into tb select 2,'j','07:30:00',6547,312,1312 insert into tb select 3,'k','08:21:00',678,7878,78898 insert into tb select 4,'j','08:55:00',789,77878,345355 go select a.时间 开始时间,b.时间 结束时间, b.甲线石灰石-a.甲线石灰石 as 甲线石灰石, b.乙线石灰石-a.乙线石灰石 as 乙线石灰石, b.脱硫电量-a.脱硫电量 as 脱硫电量 from tb a inner join tb b on a.id=b.id-1 and a.类型='k' and b.类型='j' /* 开始时间 结束时间 甲线石灰石 乙线石灰石 脱硫电量 ---------- ---------- ----------- ----------- ----------- 06:30:30 07:30:00 2002 291 1289 08:21:00 08:55:00 111 70000 266457 (2 行受影响) */ go drop table tb
------解决方案--------------------
好吧,貌似没少字段,LZ把k和j放在和时间一起了,不建议这样,不过一定要这样如下:
--> 测试数据: [tb] if object_id('[tb]') is not null drop table [tb] create table [tb] (id int,时间 varchar(20),甲线石灰石 int,乙线石灰石 int,脱硫电量 int) insert into [tb] select 1,'k 06:30:30',4545,21,23 union all select 2,'j 07:30:00',6547,312,1312 union all select 3,'k 08:21:00',678,7878,78898 union all select 4,'j 08:55:00',789,77878,345355 --开始查询 ;with cte as( select rid=ROW_NUMBER() over (order by id),type=LEFT(时间,1),time=RIGHT(时间,8),甲线石灰石,乙线石灰石,脱硫电量 from tb ) select 开始时间=a.time, 结束时间=b.time, 甲=b.甲线石灰石-a.甲线石灰石, 乙=b.乙线石灰石-a.乙线石灰石, 电量=b.脱硫电量-a.脱硫电量 from cte a join cte b on(a.rid=b.rid-1) where a.type='k' and b.type='j' --结束查询 drop table [tb] /* 开始时间 结束时间 甲 乙 电量 ---------------- ---------------- ----------- ----------- ----------- 06:30:30 07:30:00 2002 291 1289 08:21:00 08:55:00 111 70000 266457 (2 行受影响)
------解决方案--------------------
2000,不包含ID,仅计算k,j交会处的差额:
create table tb(类型 varchar(10),时间 varchar(10),甲线石灰石 int,乙线石灰石 int,脱硫电量 int) insert into tb select 'k','06:25:00',3254,10,5 insert into tb select 'k','06:30:30',4545,21,23 insert into tb select 'j','07:30:00',6547,312,1312 insert into tb select 'k','08:21:00',678,7878,78898 insert into tb select 'j','08:55:00',789,77878,345355 go select a.时间 开始时间,b.时间 结束时间, b.甲线石灰石-a.甲线石灰石 as 甲线石灰石, b.乙线石灰石-a.乙线石灰石 as 乙线石灰石, b.脱硫电量-a.脱硫电量 as 脱硫电量 from tb a inner join tb b on a.类型='k' and b.类型='j' and a.时间<b.时间 and not exists( select 1 from tb where 时间>a.时间 and 时间<b.时间) /* 开始时间 结束时间 甲线石灰石 乙线石灰石 脱硫电量 ---------- ---------- ----------- ----------- ----------- 06:30:30 07:30:00 2002 291 1289 08:21:00 08:55:00 111 70000 266457 (2 行受影响) */ go drop table tb