2

組み込みコンピューターに接続されたセンサーからカウントを収集するテーブルがあります。次のスキーマを持つテーブルがあります。

CREATE TABLE Demo (
  PKColumn BIGINT
  , FKColumn INT
  , ...
  , EventDateTime DATETIME
  , Count1 INT
  , Count2 INT
  , Count3 INT
  , Count4 INT
)

問題は、FKColumn = 1 の場合、ネット カウントが (Count1 + Count3) - (Count2 + Count4) になることです。ただし、FKColumn = 2 の場合、正味のカウントは (Count2 + Count4) - (Count1 + Count3) になります。データは組み込みコンピューターからストリーミングされており、そのコンピューターのセンサーがどのように調整されているかに基づいて、各カウントが何を意味するかについてさまざまな定義を得ることができます。

幸いなことに、センサーは一度設置すると変更されることはありません。

残念ながら、センサーの取り付け方法を制御できていないため、問題が発生します。

各列の定義は FKColumn 値ごとに異なる可能性があるため、集計関数を構築する最もパフォーマンスの高い方法は何ですか? 各 FKColumn の各センサーが何であるかを定義するためのマッピング テーブルを検討していましたが、そのソリューションを構築したとき、各計算のルックアップにコストがかかりすぎるように見えました。

データベースは Azure で実行されているため、CLR 機能はありません。

他の誰かがこの状況に直面しましたか? どのように解決しましたか?

4

2 に答える 2

2

次のようにマッピング テーブルを作成します。

CREATE TABLE Map
(
  PKColumn INT NOT NULL 
  , Count1 INT NOT NULL 
  , Count2 INT NOT NULL 
  , Count3 INT NOT NULL 
  , Count4 INT NOT NULL 
)

あなたの例に基づいて、次のものを入力します。

INSERT INTO MAP (Count1, Count2, Count3, Count4)
VALUES (1, -1, 1, -1)

INSERT INTO MAP (Count1, Count2, Count3, Count4)
VALUES (-1, 1, -1, 1)

次に、ビューを作成します。

CREATE View DemoSum
AS
SELECT CountSum = (m.Count1*d.Count1 + m.Count2*d.Count2 + 
                   m.Count3*d.Count3 + m.Count4*d.Count4)
       , d.PKColumn
       , d.FKColumn
FROM Demo d
INNER JOIN Map m ON m.PKColumn = d.FKColumn

[Demo テーブルのカウント列で null を考慮する必要がある場合があります。]

于 2012-12-04T00:07:28.067 に答える
1

次のような構造を持つ乗数と呼ばれるテーブルを作成する必要があると思います。

CREATE TABLE multipliers (
 FKColumn INT NOT NULL PRIMARY KEY,
 Mult1 INT,
 Mult2 INT,
 Mult3 INT,
 Mult4 INT)

次に、Mult1 から Mult4 までの値を 1 または -1 として定義します。提供された例では、値は次のようになります。

INSERT INTO multipliers (FKColumn, Mult1, Mult2, Mult3, Mult4) 
VALUES(1, 1, -1, 1, -1);
INSERT INTO multipliers (FKColumn, Mult1, Mult2, Mult3, Mult4) 
VALUES(2, -1, 1, -1, 1);

あとは、テーブルを JOIN するだけです。

SELECT a.FKColumn, 
Count1 * Mult1 + Count2 * Mult2 + Count3 * Mult3 + Count4 * Mult4 AS net
FROM Demo a, multipliers b 
WHERE a.FKColumn = b.FKColumn
于 2012-12-04T00:08:44.070 に答える