我们有一个表格,可以从连接到嵌入式计算机的传感器中收集计数。我有一个包含以下架构的表:
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功能。
还有其他人遇到过这种情况吗?你是怎么解决的?
答案 0 :(得分: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表计数列中考虑空值。]
答案 1 :(得分: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