2008-09-25 35 views
1

本週早些時候,我問了一個關於在運行時按順序過濾掉重複值的問題。雖然有一些很好的答案,但是我所經歷的數據量卻很緩慢並且不可行。數據庫重複值問題(基於先前值進行篩選)

當前我們的數據庫中,事件值不會被過濾。產生重複的數據值(具有不同的時間戳)。我們需要處理的數據在運行時,並在數據庫級別它的時間成本(以及不能將它拉成代碼,因爲它使用了很多存儲特效)導致高查詢時間。我們需要一個數據結構,我們可以查詢這個數據存儲已被過濾掉,因此運行時不需要額外的過濾。

目前在我們的數據庫

  • 'F07331E4-26EC-41B6-BEC5-002AACA58337', '1', '2008-05-08 04:03:47.000'
  • 「F07331E4- 26EC-41B6-BEC5-002AACA58337','0','2008-05-08 10:02:08,000'
  • 'F07331E4-26EC-41B6-BEC5-002AACA58337','0','2008-05-09 10:03:24.000'(需要刪除)**
  • 'F07331E4-26EC-41B6-BEC5-002AACA58337','1','2008-05-10 04:05:05.000'

我們需要的

  • 'F07331E4-26EC-41B6-BEC5-002AACA58337', '1', '2008-05-08 04:03:47.000'
  • 「F07331E4- 26EC-41B6-BEC5-002AACA58337' , '0', '10 2008-05-08:02:08.000'
  • 'F07331E4-26EC-41B6-BEC5-002AACA58337', '1',「2008-05-10 04:51:05.000'

這看起來微不足道,但我們的問題是,我們得到這些數據從無線設備,從而導致無序的數據包,我們的網關是多線程的,所以我們不能保證我們得到的值是爲了。有些東西可能會在4秒前進入'1',2秒前會進入'0',但我們已經進入'1'了,因爲它是第一次進入。我們一直在關注如何實現這一點。我們無法比較的數據在數據庫中的最新值,因爲最新實際上可能不會來了嗎,所以扔這些數據,我們會被擰緊,我們的順序可能是完全關閉。所以目前我們店周圍基於關閉的時候,進來的每一個值和數據庫本身的洗牌..但是單位可以發送1,1,1,0和有效的,因爲該事件仍然是活動的,但我們只希望存儲開啓和關閉狀態(的狀態1,0,1,0,1,0第一次出現)。我們想過一個觸發器,但我們不得不洗牌每一個新的價值進來,因爲這陣子的數據可能早於最後一條消息,它可以改變整個序列(插入會很慢)。

什麼想法?

詢問您是否需要更多信息。

[編輯] PK不會工作 - 問題是我們的單位實際上發送不同的時間戳。所以PK不會工作,因爲1,1,1是一樣的..但是有不同的時間戳。這就像在活動時間1的推移,事件仍然在時間2,發送回我們既..相同的值不同的時間。

+0

這是什麼RDBMS? – 2008-09-25 17:40:03

回答

0

以下是更新解決方案。性能會因指標而異。

DECLARE @MyTable TABLE 
(
    DeviceName varchar(100), 
    EventTime DateTime, 
    OnOff int, 
    GoodForRead int 
) 

INSERT INTO @MyTable(DeviceName, OnOff, EventTime) 
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 1, '2008-05-08 04:03:47.000' 
INSERT INTO @MyTable(DeviceName, OnOff, EventTime) 
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 0, '2008-05-08 10:02:08.000' 
INSERT INTO @MyTable(DeviceName, OnOff, EventTime) 
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 0, '2008-05-09 10:03:24.000' 
INSERT INTO @MyTable(DeviceName, OnOff, EventTime) 
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 1, '2008-05-10 04:05:05.000' 

UPDATE mt 
SET GoodForRead = 
CASE 
    (SELECT top 1 OnOff 
    FROM @MyTable mt2 
    WHERE mt2.DeviceName = mt.DeviceName 
    and mt2.EventTime < mt.EventTime 
    ORDER BY mt2.EventTime desc 
) 
    WHEN null THEN 1 
    WHEN mt.OnOff THEN 0 
    ELSE 1 
END 
FROM @MyTable mt 
    -- Limit the update to recent data 
--WHERE EventTime >= DateAdd(dd, -1, GetDate()) 

SELECT * 
FROM @MyTable 

不難想象,在此基礎上的過濾解決方案。這取決於您希望查看每條記錄的上一條記錄的頻率(每條查詢或每隔一段時間)。

1

如果我理解正確,你想要做的只是防止欺騙甚至進入數據庫。如果是這樣的話,爲什麼不在前兩列定義一個PK(或唯一索引),並讓數據庫爲您完成繁重的工作。基於您定義的PK或AK,Dupe插入將失敗。你的代碼(或存儲過程)將不得不妥善處理該異常。