鉴于一些信号,我需要找出具有配置的最小和最大限制的机器的状态。 我打算用以下结构(和示例数据)构建一个表
| StateID | SignalID | min | max |
|---------|----------|-----|-----|
| 1 | 1 | 1 | 2 |
| 1 | 3 | 2 | 3 |
| 2 | 2 | 0 | 4 |
| 3 | 2 | 5 | 9 |
因此我可以通过那些有效的行找到可能的状态(在SignalID的值在min和max之间的意义上)。 然后,所有信号的有效状态的交集应该导致正确的状态(假设表以这种方式完成)。但是 - 对于某些州而言,对某一特定信号可能没有亲和力 - 我认为必须首先对各州进行认识 - 这似乎是效率低下的,或者是什么? 上面给出的表中的一些示例(满足意味着,SignalValue介于最小值和最大值之间):
重新开始我有一些问题:
感谢您的任何想法和帮助。
答案 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);
嗯,可能有办法更有效地编写查询,但你明白了。