SQLite:选择所有日期-值对,满足每个日期与第一个日期的距离为特定周期的倍数
我正在使用SQLite和Python,想要获取一些特定的日期(以及对应的值)。我觉得用一个例子来说明我想要的内容最清楚。
-(2011-01-02, 4.0)
-(2011-01-14, 5.0)
-(2011-02-02, 5.5)
-(2011-02-07, 6.5)
-(2011-02-12, 7.0)
-(2011-02-15, 4.0)
-(2011-03-02, 2.5)
-(2011-03-09, 3.5)
假设我们要从这些数据中选择,要求第一个日期和我们要找的所有日期之间的间隔是一个月(或者是一个月的整数倍),那么我们会得到这些数据:
-(2011-01-02, 4.0)
-(2011-02-02, 5.5)
-(2011-03-02, 2.5)
我在寻找一个SQL语句,能让我获取这些数据,如果可能的话。
附加问题:如果没有一个日期正好是距离初始日期一个月的整数倍,我该如何找到数据库中最近的日期呢?
我希望我的解释足够清楚。如果不清楚,感谢你告诉我。
1 个回答
1
听起来这个解决方案可能不够灵活,不能完全满足你的需求。不过,直接回答你的问题,这里有一个查询可以帮你得到你想要的结果。
另外,因为你没有说明表格或列的名称,我用的测试表叫做 foo
,里面有 created
和 value
这两列。
select
foo.created, foo.value
from
-- Subquery to pick first record to base rest of query on
(
select
created,
strftime('%d', created) as day
from
foo
order by
created
limit 1
) as bar
-- Join all rows in foo that are greater than that found in 'bar'
-- and has the same day of the month.
join foo
on foo.created >= bar.created
and strftime('%d', foo.created) = bar.day
结果:
2011-01-02|4.0
2011-02-02|5.5
2011-03-02|2.5
注意 - 这个方法可能效率不高,因为用了很多 strftime
,我猜这里不能使用索引。
注意 2 - 这个查询只处理正好一个月的时间间隔,不会特别处理如果有两个记录的日期相同,或者识别数据中是否有缺失(例如:如果 2011-02-02
这个日期缺失,查询依然会返回 2011-03-02
的结果)。