在SQL中聚合通用列

时间:2012-12-03 23:31:53

标签: sql-server tsql

我们有一个表格,可以从连接到嵌入式计算机的传感器中收集计数。我有一个包含以下架构的表:

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功能。

还有其他人遇到过这种情况吗?你是怎么解决的?

2 个答案:

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