SQLite: выберите все пары дата-значение, где расстояние между каждой датой и первой датой кратно определенному периоду. - PullRequest
2 голосов
/ 12 октября 2011

Я работаю с 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 голос
/ 28 ноября 2011

Похоже, это не будет достаточно гибким решением для ваших нужд, но чтобы ответить на ваш вопрос напрямую, вот запрос, который даст вам то, что вам нужно.

Кроме того, поскольку вы не указали имена таблиц / столбцов, моя тестовая таблица, которую я использовал, называется 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...