Я хочу выяснить, на сколько разных 24-часовых интервалов произошло слово (обратите внимание, что фактическое приложение отличается и является более сложным, но это эквивалентно и не требует контекста).
Я мог бы сделать это с SQL запросом, подобным этому в Postgresql:
SELECT
word,
COUNT(DISTINCT FLOOR(EXTRACT(EPOCH FROM AGE(created_at)) / 86400)) AS num_distinct_days_with_occurrence
FROM word_occurrences
GROUP BY word
Мне даже удалось написать код Rails, который генерирует этот запрос:
WordOccurrence.select(:word).group(:word).distinct.count('FLOOR(EXTRACT(EPOCH FROM AGE(created_at)) / 86400)')
Однако, это не работает в Sqlite3 с тем же кодом.
Полагаю, если я потрачу какое-то время, я мог бы также найти способ заставить его работать в Sqlite3, но я не могу понять, как получить оба на работу. Я видел, что API подсчета имел больше функций в прошлых версиях rails, но я думаю, что даже этого будет недостаточно, учитывая, что моя главная проблема - обработка временных меток, а не подсчет. Кроме того, я не мог понять, где эти функции были в Rails 6.
Есть ли способ заставить это работать для обоих адаптеров? И если нет, то как лучше всего обработать такие фрагменты кода, зависящего от базы данных, и выбрать правильный?
Пример данных:
[
{ word: 'a', created_at: '2020-01-10 22:30' },
{ word: 'a', created_at: '2020-01-10 23:30' },
{ word: 'a', created_at: '2020-01-11 22:30' },
{ word: 'b', created_at: '2020-01-10 22:30' }
]
Если я сделаю запрос в 2020-04- 08, я должен получить такой результат:
[
{ word: 'a', num_distinct_days_with_occurrence: 2 },
{ word: 'b', num_distinct_days_with_occurrence: 1 }
]