对不起的标题感到抱歉。我会随着时间进行编辑。
我有一张表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
答案 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个额外的更新查询,但您不必根据您的选择中的日期进行计算,并且您的表存储占用的空间更少(因为日期时间位更小)
只是解决这个问题的另一种方法;-)我很想看到这个以及上面建议的日期时间方法的性能影响