有三个数据库表
1、数据流水库
日期 时间 状态1
2009-04-23 22:00 A
2009-04-23 23:00 A
2009-04-24 01:00 A
2009-04-24 02:00 A
2009-04-24 03:00 A
2009-04-24 04:00 A
2009-04-24 05:00 B
2009-04-24 06:00 B
2009-04-24 07:00 B
2009-04-24 08:00 B
2009-04-24 09:00 B
2009-04-24 10:00 B
2009-04-24 11:00 B
2009-04-24 12:00 B
2009-04-24 13:00 B
2009-04-24 14:00 B
2009-04-24 15:00 A
2009-04-24 16:00 A
2009-04-24 17:00 A
2009-04-24 18:00 A
2009-04-24 19:00 A
2009-04-24 20:00 A
2009-04-24 21:00 A
2009-04-24 22:00 A
2009-04-24 23:00 A
2、报警库逻辑库
报警字段 级别 持续小时 报警级别
状态1 A 8 红
状态1 A 2 黄
状态1 B 8 蓝
3、报警库
日期 报警
2009-04-24 状态1:红
这是期望结果 怎么样通过第一个库及第二个库,通过一定的算法得到第三个库
已知:第一个库为流水库 ,第二个库为条件库
原来打算将第二个库在C#中转成hashtable来判断,然后将第一个库的数据读出来,进行累加,和hashtable对应,但有个问题,就是时间如果A持续大于2个小时,并且小于8小时,怎么来判断,大于8小时,怎么来判断,也就是怎么组织这个hashtable,使数据能快速地进行判断,大家有做过这方面的东西么?
1、数据流水库
日期 时间 状态1
2009-04-23 22:00 A
2009-04-23 23:00 A
2009-04-24 01:00 A
2009-04-24 02:00 A
2009-04-24 03:00 A
2009-04-24 04:00 A
2009-04-24 05:00 B
2009-04-24 06:00 B
2009-04-24 07:00 B
2009-04-24 08:00 B
2009-04-24 09:00 B
2009-04-24 10:00 B
2009-04-24 11:00 B
2009-04-24 12:00 B
2009-04-24 13:00 B
2009-04-24 14:00 B
2009-04-24 15:00 A
2009-04-24 16:00 A
2009-04-24 17:00 A
2009-04-24 18:00 A
2009-04-24 19:00 A
2009-04-24 20:00 A
2009-04-24 21:00 A
2009-04-24 22:00 A
2009-04-24 23:00 A
2、报警库逻辑库
报警字段 级别 持续小时 报警级别
状态1 A 8 红
状态1 A 2 黄
状态1 B 8 蓝
3、报警库
日期 报警
2009-04-24 状态1:红
这是期望结果 怎么样通过第一个库及第二个库,通过一定的算法得到第三个库
已知:第一个库为流水库 ,第二个库为条件库
原来打算将第二个库在C#中转成hashtable来判断,然后将第一个库的数据读出来,进行累加,和hashtable对应,但有个问题,就是时间如果A持续大于2个小时,并且小于8小时,怎么来判断,大于8小时,怎么来判断,也就是怎么组织这个hashtable,使数据能快速地进行判断,大家有做过这方面的东西么?
比如说 状态A, 持续5小时,然后将按持续时间降序取出逻辑库数据,
条件为 级别 = “A”, 持续时间 <= 5,
找到的第一条符合条件的就是了。
报警字段 级别 持续小时 报警级别
状态1 A 8 红
状态1 A 4 橙
状态1 A 2 黄
状态1 A 1 蓝 状态1 B 16 红
状态1 B 8 橙
状态1 B 4 黄
状态1 B 2 蓝 状态1 C 32 红
状态1 C 16 橙
状态1 C 8 黄
状态1 C 4 蓝 状态1 D 64 红
状态1 D 32 橙
状态1 D 16 黄
状态1 D 8 蓝
----------------------------------
2004-04-23 A 状态1:黄
2004-04-24 A 状态1:红
2004-04-24 B 状态1:蓝楼主最好把规则描述清楚。
假设报警逻辑库为 AlarmMap,报警字段(AlarmMap),级别(AlarmPrior),持续时间(SpanMin),报警级别(AlarmLevel),SQL 为(基于 SQL Server 2005)
Select A1.AlarmField, A1.AlarmPrior, A1.SpanMin TSpanMin, IsNull((A2.SpanMin - 1), 32767) TSpanMax, A1.AlarmLevel From
(Select Row_Number() over(Order By AlarmPrior, SpanMin) SN, * From AlarmMap Where AlarmField = '状态1') A1
Left Join
(Select Row_Number() over(Order By AlarmPrior, SpanMin) SN, * From AlarmMap Where AlarmField = '状态1') A2
On A2.SN = A1.SN + 1 And A1.AlarmPrior = A2.AlarmPrior
最终的数据形式为:
AlarmField AlarmPrior TSpanMin TSpanMax AlarmLevel
---------- ---------- -------- -------- ----------
状态1 A 1 1 蓝
状态1 A 2 3 黄
状态1 A 4 7 橙
状态1 A 8 32767 蓝