declare @ln nchar(20)
declare @xn nchar(6)
declare @dn nchar(8)
declare @sjn nchar(6)
然后用游标逐行取出相邻的两行值,赋值给这八个变量。
接下来依次判断卡号,日期,时间,线路;
单次判断完成后,执行
set @l=@ln
set @x=@xn
set @d=@dn
set @sj=@sjn
再读取下一行记录,并重复判断
用这样的方法能在4分钟里完成
现在发帖求助,是否有更高效的解决方案。
因为,有看到资料说,数据超过1万行就应避免使用游标,改用while来处理
可是我试了while循环,一个晚上都没出结果。
附上SQL代码
--生成临时表
select * into #b from
(
select listbh,[dealrq],[dealsj],xlbh from cpuxfmx2011701720
union all
select listbh,[dealrq],[dealsj],xlbh from cpuxfmx2011721731
)
AS table_source
--定义游标
declare test_Cursor cursor scroll for
select listbh,xlbh,[dealrq], dealsj from #b order by listbh,[dealrq],dealsj
go
--取第一行的值
fetch FIRST from test_Cursor into @l,@x,@d,@sj
while @@FETCH_STATUS=0
begin
--逐行取值
fetch NEXT from test_Cursor into @ln,@xn,@dn,@sjn
--判断
if @l=@ln
begin
if @x!=@xn
begin
if @d=@dn
begin
--if datediff(minute, convert(datetime, @sj), convert(datetime, @sjn))<=90
--由于dealsj字段里包含不能转换成datetime的值
--采用下述方式判断,并把间隔改成90+40(时间的60进制与数字的10进制差异)=130
if convert(int,(SUBSTRING(@sjn,1,4)))-convert(int,(SUBSTRING(@sj,1,4)))<=130
begin
--累加计数器
set @c=@c+1
end
end
end
end
set @l=@ln
set @x=@xn
set @d=@dn
set @sj=@sjn
end
print @c
--关闭游标
close test_Cursor
--销毁游标
deallocate test_Cursor