关于一个SQL server项目编程问题

问题或许很很难很复杂,但是我还是希望有人能帮我解决下,本人是刚刚出来学校的实习生,现在实习的公司,我上司安排了个项目给我,但是没有人带,我上司也只是懂接触过一点点SQL server,但并不是专家,现在项目凭着我自己翻寻各种百度和CSDN,完成了一半进度,但是现在真的遇到难题了,不知道怎么往下编写程序了,希望求各路SQL server大神、高手、专家帮我解决这个问题,如果可能我觉得下面的思路还是不清晰,可以加我QQ:584958184

图1
图2
来讲下问题吧,就是计算时间差和传递的问题,目前表里的数据是我手动输入的,但实际上是机器开启后(机器状态为0的时候就是恢复运行状态),数据自动往table4插入的,由于后期数据量很大,有个百度吧友建议我用游标来做,可是我不会用游标......

我来说下效果的思路:
当table4中每次出现的一条错误代码记录时(当location、pointer和ng-itime字段下有数据时,就是一条错误代码),用它们下一条状态记录machine-itime的时间(状态记录的时间也就是machine-status字段为0值的machine-itime字段)减去它自己的ng-itime时间,得出来的时间差值就是这条错误代码的持续时间。并且把这个值传递去table5去,但这个传递有条件,就是以错误类型为条件(table4中的location+pointer字段就是一个类型),例如table4中(图1),出现了3条错误代码,类型分别为sta080 63、zone6 49和System 481,每条错误代码的的下一条状态记录的时间(machine_itime)减去它们各ng_itime,得出来的时间差值要传递到table5对应类型的错误代码中,并把此值插入到time字段中(table5表图是图2)。

还要注意的是,table4的每一条错误代码记录,肯定会有重复出现的,重复出现的错误代码,经过计算出来的时间差值,然后选择table5相对应的错误代码类型,要与旧记录的时间差值进行叠加!!!并不是替换,而是旧记录与新纪录进行相加~!!

4个回答

用存储过程把整个逻辑写出来,然后给table4添加个插入触发器再调用存储过程就行,详细扣扣谈

如果你想纯sql语句实现,应该不太可能。如果利用某种语言来实现,应该不是太难。

无非是按id排序查询null和0状态的数据,null的值对应下一个0状态的数据,得到时间差值,然后基于location+pointer做字典累加,最后输入到table5。

如果要考虑可以断点计算,需要记录处理的id值,下次从id值记录,这样需要把table5的值取出来做location+pointer的字典,table4的续计算同样
累加到字典再输出到table5,考虑到数据安全,要考虑加锁读取和存储table5。也可以考虑采用更新方式来保证安全。

wodeqq584958184
wodeqq584958184 某种语言是?? 意思是不用T-SQL语言吗?
一年多之前 回复

可以使用纯SQL实现这个业务逻辑,就是不知道你们这个数据要每隔多长时间采集一次(采集的时间范围),如果table4中连续出现两条不同错误代码记录,
怎么确定后面恢复时间对应的是哪条ng记录;如果可行的化建议用触发器比较好,只需要两个SQL就搞定

wodeqq584958184
wodeqq584958184 回复john121212: 游标我上礼拜有练过基础了解了下,但并不知道怎么去实现这个效果,可以加我QQ详细跟我述说下思路,非常感谢(*^__^*)
一年多之前 回复
wodeqq584958184
wodeqq584958184 回复wangzhengziyu: 设备的话,应该是只有一台或者一台收集完数据再去收集另一台
一年多之前 回复
wangzhengziyu
wangzhengziyu 回复wodeqq584958184: 采集时间的话是根据你们的业务逻辑要求定义的,如果需要实时的就需要定义触发器有变更就更新;如果不是实时采集数据可以定义Procedure每隔3分钟5分钟或者更长收集这段事件内有变化的数据(根据业务需要);我看到你定义的这几张表应该是table2是存放设备当前状态的,table4是存放设备异常或状态变更的记录,table5是收集设备异常持续时间的,但是如果有两台设备连续异常了,会有几笔数据插入到table4?
一年多之前 回复
john121212
john121212 我要分,下载,居然不能回答问题
一年多之前 回复
john121212
john121212 游标可以实现,使用游标读取一条条记录,然后取数据 declare @MS 类型 ,@LA 类型, @Po 类型,@NGT smalldatetime Declare mycursor cursor for select ID,machine-status,location、pointer,ng-itime from table oepn @cursor fetch next from mycursor into @MS,@LA,@Po,@NGT while(@@fetchStatus=0) begin 这里面就做你要做的事情 end 附加:游标就是一个循环,你可以把它当做一个指针,一条一条的读取数据,读取一条往下,你可以获取到ID,这里面你可以根据 if语句 判断 if @LA is not null and @po is not null and @ng is not null 也可以反向判断 if 这其中有一个null break
一年多之前 回复
wodeqq584958184
wodeqq584958184 回复wangzhengziyu: 至于采集时间,你有什么建议吗??大神(*^__^*)
一年多之前 回复
wodeqq584958184
wodeqq584958184 table4中插入的错误代码记录只会插入一条(0到非0状态,再恢复为0这一个循环下只会插入一条错误代码),table4的错误代码是触发了table2的触发器,经过筛选后,才传递过来的
一年多之前 回复

我觉得可以用存储过程,存储过程里面可以进行多个表,变量操作。一个存储过程,就可以搞定。在不行,多些几个自定义函数就可以了。sql server 又 不是oracle 。oracle是很low才会需要用游标。表示非常鄙视游标

wangzhengziyu
wangzhengziyu oracle可不low,相反针对数据量大来说Oracle性能比sqlserver好太多了,游标是针对需要逐行处理的数据使用,针对获取更新插入或删除的值也是默认使用的游标,并不是一无是处
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!