SQLite:选择所有日期-值对,满足每个日期与第一个日期的距离为特定周期的倍数

2 投票
1 回答
748 浏览
提问于 2025-04-17 04:07

我正在使用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,里面有 createdvalue 这两列。

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 的结果)。

撰写回答