运行长度编码数据的最佳方式

时间:2014-06-20 14:08:41

标签: sql sql-server run-length-encoding

我创建了一个跟踪对象各种属性的表。

 Id | Attribute1 | Attribute2 | Attribute3 | StartDate  | EndDate
------------------------------------------------------------------
 01 |   100      |   Null     |   Null     | 2004-02-03 | 2006-04-30
 01 |   100      |   Null     |    D       | 2006-05-01 | 2010-11-06
 01 |   150      |   Null     |    D       | 2010-11-07 | Null
 02 |   700      |   5600     |   Null     | 1998-09-27 | 2002-01-27

每天都有新数据(约数万条记录)。我想要做的是将每个记录与该id的当前数据进行比较,然后:

a)如果属性匹配则不执行任何操作。 b)如果属性不同,请更新当前记录以使EndDate为当前日期,并使用新属性创建新记录。 c)如果没有该id的任何数据,则创建一条新记录。

我的问题是,最有效的方法是什么?

我可以编写一个遍历每条记录的脚本,进行比较,并根据情况更新表格,但我觉得这是一种蛮力,而不是一种智能解决方案。

这是一个使用游标的好地方吗?

1 个答案:

答案 0 :(得分:0)

您如何处理数据?它是批量生产还是批量生产?

如果是这样的话,那么我会对最可能的属性进行一系列检查以进行更改,并且最不可能(只是为了优化检查)并根据需要进行更新。数以千计的数据不足以担心放慢太多。这是一种直接的方法。

如果您作为批处理(如每天业务结束时)处理,请按ID排序数据,然后按结束日期降序。删除所有其他ID实例,只关心最新的实例。没有中间数据是重要的。

示例:您有2个id为1的条目,一个有endDate Jan 1,另一个有endDate Jan 25.首先查看Jan 25条目并根据需要进行更新。 1月1日的入职时间太长了,无法关心。