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 表计数列中的空值。]

于 2012-12-04T00:07:28.067 回答
1

我认为您需要创建一个名为 multipliers 的表,其结构类似于:

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);

然后你所要做的就是加入表格:

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 回答