有三个数据库表 
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.   

    不懂,帮ding!解决问题的时候,记得给点辛苦分
      

  2.   

    看样子只需要统计最后状态的持续时间。那么从流水库取出最新的若干条数据(从例子看十多条就够了), 找出最后状态及其持续时间,
    比如说 状态A, 持续5小时,然后将按持续时间降序取出逻辑库数据, 
    条件为 级别 = “A”, 持续时间 <= 5,
    找到的第一条符合条件的就是了。
      

  3.   

    这个只是个例子,第二个库,会有很多条规则, 每个规则都有其上限及下限 例如
      报警字段    级别 持续小时  报警级别    
      状态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      蓝
     
       
      

  4.   

    从样例数据看结果应该是吧:日期        级别       报警
    ----------------------------------  
    2004-04-23  A          状态1:黄
    2004-04-24  A          状态1:红
    2004-04-24  B          状态1:蓝楼主最好把规则描述清楚。
      

  5.   

    其实楼主可以用左连接求出报警逻辑库中持续时间的最小值和最大值,然后再赋到 C# 中的 hashtable,这样比较不就很方便了吗?比如说
    假设报警逻辑库为 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  蓝
      

  6.   

    其实你这个问题可以单纯用 SQL 来解的,同样用左连接求出数据流水库中每个状态的持续时间,然后再跟上面连接出的报警逻辑表 Join XXX On 持续时间 between TSpanMin And TSpanMax 再加上其它相关的条件就可以了,就不知道效率会怎么样。