SQL:仅检索其值已更改的记录
很抱歉给你一个不起眼的标题。我会一边编辑一边继续 我有一张桌子,价格表:SQL:仅检索其值已更改的记录,sql,sql-server,Sql,Sql Server,很抱歉给你一个不起眼的标题。我会一边编辑一边继续 我有一张桌子,价格表: 每天都有一个条目,但速率很少变化。我是否可以编写一个SQL查询,只返回发生速率更改的行?我正在使用SQLServer添加一个新列,该列将是DateTime,并在速率更改时跟踪。然后您可以返回DateModified>=x的任何列,其中x是您最后一次检查的列。我会将[ModifiedDate]列添加到您的表中,并在每次插入或更新新记录时更新其值。然后,您将能够基于该列从表中获取数据: SELECT * FROM [YourT
每天都有一个条目,但速率很少变化。我是否可以编写一个SQL查询,只返回发生速率更改的行?我正在使用SQLServer添加一个新列,该列将是DateTime,并在速率更改时跟踪。然后您可以返回DateModified>=x的任何列,其中x是您最后一次检查的列。我会将[ModifiedDate]列添加到您的表中,并在每次插入或更新新记录时更新其值。然后,您将能够基于该列从表中获取数据:
SELECT * FROM [YourTable] WHERE [ModifiedDate] > '2008-01-20 10:20'
如果添加新列LastChangedDate并跟踪其他表(即LastReadedValues)中的最后一次读取,则可以轻松跟踪更改。如果我读对了这一点,则您不会查找已修改的行,而是查找速率从上一日期更改的行。此查询或类似查询应该可以:
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)
我建议,如果你在这一点上有控制权,只有正确的簿记数据。换句话说,只有在速率发生变化时才向表中写入记录。然后,您可以假设更改之间的任何数据都将保持不变。这将大大减少需要存储的数据量 这就是说,这个查询,或者一些接近的查询,都无法完成您的要求:
select rt.Code, MIN(rt.Date), rt.Rate
from RateTable rt
group by rt.Code, rt.Rate
编辑:抱歉,将最大值更改为最小值这种方法怎么样 添加一个名为ChangedSinceLastRead的位列,每当您更改此表中的值时,将其设置为1,并在select查询中从ChangedSinceLastRead=1的速率读取select*FROM 在此之后,选择查询激发另一个查询更新率集ChangedSinceLastRead=0 尽管您必须对此启动1个额外的更新查询,但您不必根据select中的日期进行计算,而且由于位小于datetime,所以表存储占用的空间更少
这只是解决这个问题的另一种方法;-我很想了解这一方法以及上述建议的日期时间方法对性能的影响如果您的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
但是如果利率是1.05,上升到1.06,然后下降到1.05,那么你就失去了第一个周期。你完全正确。好吧…忽略我的SQL,但我还是会在它之前接受建议。哦,好吧,我完全没有领会他在这个问题上的意图。但是看看他的样本数据,我认为你是对的,我读了好几遍——如果你的阅读是对的,那么你的解决方案当然也是对的……有关更现代的sql server答案,请参阅
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