按数据库限制的信号值分类

时间:2013-03-21 07:18:14

标签: sql classification

鉴于一些信号,我需要找出具有配置的最小和最大限制的机器的状态。 我打算用以下结构(和示例数据)构建一个表

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

因此我可以通过那些有效的行找到可能的状态(在SignalID的值在min和max之间的意义上)。 然后,所有信号的有效状态的交集应该导致正确的状态(假设表以这种方式完成)。但是 - 对于某些州而言,对某一特定信号可能没有亲和力 - 我认为必须首先对各州进行认识 - 这似乎是效率低下的,或者是什么? 上面给出的表中的一些示例(满足意味着,SignalValue介于最小值和最大值之间):

  • (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 个答案:

答案 0 :(得分: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);

嗯,可能有办法更有效地编写查询,但你明白了。