数据库重复值问题(基于先前值进行筛选)

问题描述:

本周早些时候,我问了一个关于在运行时按顺序过滤掉重复值的问题。虽然有一些很好的答案,但是我所经历的数据量却很缓慢并且不可行。数据库重复值问题(基于先前值进行筛选)

当前我们的数据库中,事件值不会被过滤。产生重复的数据值(具有不同的时间戳)。我们需要处理的数据在运行时,并在数据库级别它的时间成本(以及不能将它拉成代码,因为它使用了很多存储特效)导致高查询时间。我们需要一个数据结构,我们可以查询这个数据存储已被过滤掉,因此运行时不需要额外的过滤。

目前在我们的数据库

  • '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

以下是更新解决方案。性能会因指标而异。

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 

不难想象,在此基础上的过滤解决方案。这取决于您希望查看每条记录的上一条记录的频率(每条查询或每隔一段时间)。

如果我理解正确,你想要做的只是防止欺骗甚至进入数据库。如果是这样的话,为什么不在前两列定义一个PK(或唯一索引),并让数据库为您完成繁重的工作。基于您定义的PK或AK,Dupe插入将失败。你的代码(或存储过程)将不得不妥善处理该异常。