2012-12-03 31 views
2

我們有一個表格,用於收集連接到嵌入式計算機的傳感器的計數。我與下面的模式的表:在TSQL中聚合通用列

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

的問題是,對於FKColumn = 1淨計數將是(共1個記錄+共3個記錄) - (共2個記錄+ Count4)。但是對於FKColumn = 2,淨數將是(Count2 + Count4) - (Count1 + Count3)。數據從嵌入式計算機流入,根據計算機上傳感器的校準方式,我們可以根據每個計數的含義得出不同的定義。

幸運的是,一旦安裝了傳感器,它們永遠不會改變。

不幸的是,傳感器的安裝方式缺乏控制......因此存在問題。

由於每列的定義對於每個FKColumn值都不相同,因此建立我的聚合函數的最高性能方法是什麼?我正在考慮映射表來定義每個FKColumn的每個傳感器,但是當我構建該解決方案時,它看起來好像每個計算的查找花費太多。

數據庫在Azure中運行,因此沒有CLR功能。

有沒有其他人面臨這種​​情況?你是如何解決它的?

回答

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 

[您可能需要請考慮您的演示表格數列中的空值。]

+0

英雄所見略同 – cha

+0

我喜歡,有什麼好笑的是我有一個類似昨晚睡覺時想。奇怪的是,當你不專注於解決方案時,解決方案會變得更容易。 – slowder

+0

幸運的是,計數總是> = 0,沒有NULL! – slowder

1

我認爲你需要與類似結構創建一個表名爲乘數:

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

然後通過對Mult4爲1定義爲MULT1值或-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 
+0

擊敗你:),但是從我+1。 (請轉換爲使用ANSI連接語法) –