0

いくつかの信号が与えられた場合、最小および最大制限が構成されたマシンの状態を調べる必要があります。次の構造(およびサンプルデータ)のテーブルを作成する予定です

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

したがって、有効な行によって可能な状態を見つけることができます (SignalID の値が最小値と最大値の間にあるという意味で)。すべての信号の有効な状態が交差すると、正しい状態になります (テーブルがそのように完成していると仮定します)。しかし、いくつかの状態については、特定の信号に親和性がない可能性があります-最初に状態を反復処理する必要があると思います-どういうわけか非効率的だと思われるもの、または?
上記の表の例 (満たされた場合、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 に答える 1

1

わかりました、あなたが実際に尋ねたことではなく、あなたの質問だと思うことに答えます。あなたがやろうとしていることを理解できなかった場合は、さらに明確にしてください。

2 つの異なる事実を保存していますが、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 に答える