SQL:仅检索其值已更改的记录

时间:2009-03-27 14:14:36

标签: sql sql-server

对不起的标题感到抱歉。我会随着时间进行编辑。

我有一张表RateTable

| Code   |  Date     |   Rate  |

  B001     2009-01-01   1.05
  B001     2009-01-02   1.05
  B001     2009-01-03   1.05
  B001     2009-01-04   1.05
  B001     2009-01-05   1.06
  B001     2009-01-06   1.06
  B001     2009-01-07   1.06
  B001     2009-01-08   1.07

每天都有一个条目,但费率很少变化。我是否可以编写一个只返回发生速率变化的行的SQL查询?我正在使用SQLServer

7 个答案:

答案 0 :(得分:15)

如果我读得正确,你不是在寻找修改过的行,而是在寻找费率从上一个日期开始变化的行。这个查询或类似的东西应该这样做:

SELECT  r1.Code, r1.Date, r1.Rate
FROM    RateTable r1
WHERE   r1.Rate <> (SELECT TOP 1 Rate
                   FROM    RateTable
                   WHERE   Date < r1.Date
                   ORDER BY Date DESC)

答案 1 :(得分:3)

如果您的RDBMS支持分析功能,那么最佳方法几乎可以肯定:

select code, date, rate, last_rate
from
(
select code,
       date,
       rate,
       lag(rate) over (partition by code order by date) last_rate
from   ratetable
) my_tb
where  my_tb.rate != my_tb.last_rate

答案 2 :(得分:0)

添加一个新列,该列将是DateTime并在速率更改时跟踪。然后,您只需返回DateModified&gt; = x的任何列...其中x是您上次检查的时间。

答案 3 :(得分:0)

我会将[ModifiedDate]列添加到您的表中,并在每次插入或更新新记录时更新它的值。然后,您将能够根据该列从表中获取数据:

SELECT * FROM [YourTable] WHERE [ModifiedDate] > '2008-01-20 10:20'

答案 4 :(得分:0)

如果您添加新列“LastChangedDate”并跟踪其他表中的最后一次读取(即LastReadedValues),则可以轻松跟踪更改。

答案 5 :(得分:0)

我建议,如果你现在已经控制了这一点,那么只能提供正确的书籍数据。换句话说,只有在速率变化时才将记录写入表中。然后,您可以假设更改之间的任何数据都保持不变。这将大大减少您需要存储的数据量。

那就是说,这个问题,或者说是接近的,可以满足你的要求:

select rt.Code, MIN(rt.Date), rt.Rate
from RateTable rt
group by rt.Code, rt.Rate

修改:抱歉,将max更改为min

答案 6 :(得分:0)

这种做法怎么样?

添加名为ChangedSinceLastRead的位列,每当您更改此表中的值时,将其设置为1,并在您的选择查询中读取“SELECT * FROM Rate WHERE ChangedSinceLastRead = 1”

在此选择查询之后触发另一个查询“UPDATE Rate SET ChangedSinceLastRead = 0”

虽然您必须在此处启动1个额外的更新查询,但您不必根据您的选择中的日期进行计算,并且您的表存储占用的空间更少(因为日期时间位更小)

只是解决这个问题的另一种方法;-)我很想看到这个以及上面建议的日期时间方法的性能影响