0

给定一些信号,我需要找出具有配置的最小和最大限制的机器的状态。我计划建立一个具有以下结构的表(和示例数据)

| StateID | SignalID | min | max |  
|---------|----------|-----|-----|  
|    1    |    1     |  1  |  2  |  
|    1    |    3     |  2  |  3  |  
|    2    |    2     |  0  |  4  |  
|    3    |    2     |  5  |  9  |  

因此,我可以通过有效的那些行找到可能的状态(在 SignalID 的值介于 min 和 max 之间的意义上)。所有信号的有效状态的交集应该导致正确的状态(假设表格以这种方式完成)。但是-至于某些状态,可能对给定信号没有亲和力-我认为必须首先遍历状态-似乎效率低下,或者?
上表中的一些示例(如果已实现,则 SignalValue 介于 min 和 max 之间):

  • (1,2,3) -> 1(第 1 行和第 2 行已完成)或 -> 2(第 3 行已完成)
  • (2,9,2) -> 1(第 1 行和第 2 行已完成)或 -> 3(第 4 行已完成)
  • (3,1,3) -> 2(仅满足第 3 行)
  • (3,8,2) -> 3(仅满足第 4 行)

重新开始我有一些问题:

  1. 我可以更改表结构(或逻辑)中的某些内容以优化它吗?
  2. 如何处理不依赖于信号的状态而不为该状态添加具有 min=-infinity 和 max=infinity 的行?
  3. 由于状态和信号的数量是动态的——如何高效地进行相应的查询?可以在 SQL 中完成(结果的动态计数的)交集吗?

感谢您的任何想法和帮助。

4

1 回答 1

1

好的,我将回答我认为您的问题,而不是您实际提出的问题。因此,如果我没有得到您想要做的事情,请进一步澄清。

您正在存储两个不同的事实,但您只给出了一个示例。我假设您要记录 A) 允许的状态和 B) 观察到的状态,即:

CREATE TABLE valid_states (
  state_nbr integer not null,
  signal_nbr integer,
  signal_min integer,
  signal_max integer,

  PRIMARY KEY (state_nbr, signal_nbr)
);

CREATE TABLE observed_signals (
  signal_nbr integer primary key,
  signal_value integer not null
);

然后,您可以通过从以下两者中进行选择来查询“观察到的有效状态”:

SELECT s.state_nbr, o.signal_nbr 
  FROM valid_states AS s LEFT JOIN observed_signals AS o ON s.signal_nbr = o.signal_nbr 
  WHERE o.signal_value BETWEEN s.signal_min AND s.signal_max 
    OR (s.signal_min IS NULL AND o.signal_value <= s.signal_max)
    OR (s.signal_max IS NULL AND o.signal_value >= s.signal_min)
    OR (s.signal_min IS NULL AND s.signal_max IS NULL);

好吧,可能有一些方法可以更有效地编写该查询,但你明白了。

于 2013-03-21T10:15:17.287 回答