Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:仅检索其值已更改的记录_Sql_Sql Server - Fatal编程技术网

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