Запрос текущих данных из исторических данных - PullRequest
0 голосов
/ 20 сентября 2018

Я работаю над этим личным проектом некоторое время, и я ломаю голову над этой одной проблемой.

Каждые 20 минут мой cron берет данные из сообщений в subreddit.Данные включают в себя такие данные, как количество голосов, количество голосов и т. Д. У меня также есть столбец для времени сбора данных, чтобы я мог найти самые актуальные данные для каждого представления.

Текущие данные отображаются навеб-страница для этого представления, и исторические данные для этого представления отображаются в виде диаграмм и графиков на этой странице, поэтому мне нужны оба набора.

Некоторые примеры столбцов для структуры таблицы:

reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments

Таблица содержит несколько reddit_ids, каждый со своими индивидуальными данными (total_upvotes, upvote_ratio) в определенный момент времени (retrieval_time).

Мой первоначальный рефлекс - сделать запрос для всех reddit_ids, а затем выполнить итерациюперечислите и выполните запрос для каждого идентификатора, как показано ниже:

SELECT reddit_id FROM nstats;

Затем выполните итерации по результатам запроса и выполните этот запрос для каждого:

SELECT * FROM nstats WHERE reddit_id='9hdajv' ORDER BY retrieval_time DESC;

Этот метод работает довольно медленно, по крайней мере, в моем тестировании.Я использую Postgres с Peewee и Python для доступа к базе данных.

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

Добавление примера выходных данных для пояснения.Вот как должна выглядеть необработанная таблица: несколько reddit_ids, каждый со своими собственными данными.

reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments
9hdajv | 1537471220 | 15 | .78 | 3
9hdajv | 1537298420 | 7 | .98 | 0
9hdajv | 1537384820 | 10 | .86 | 1
7klmnq | 1534706420 | 25 | .86 | 1
7klmnq | 1534965620 | 35 | .75 | 5
3poslo | 1535311220 | 16 | .75 | 3
3poslo | 1535397620 | 20 | .83 | 6
3poslo | 1535570420 | 37 | .85 | 9

Это будет вывод, 1 reddit_id каждый со своими самыми последними данными.

reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments
9hdajv | 1537471220 | 15 | .78 | 3
7klmnq | 1534965620 | 35 | .75 | 5
3poslo | 1535570420 | 37 | .85 | 9

1 Ответ

0 голосов
/ 20 сентября 2018

Этот запрос приближается к ожидаемому результату.

Запрос

SELECT 
   Table1."reddit_id"
 , Table1."retrieval_time"
 , Table1."total_upvotes"
 , Table1."upvote_ratio"
 , Table1."num_comments" 
FROM (

  SELECT 
     Table1."reddit_id"
   , Table1."retrieval_time"
   , Table1."total_upvotes"
   , Table1."upvote_ratio"
   , Table1."num_comments" 
   , ROW_NUMBER() OVER (PARTITION BY  Table1."reddit_id" ORDER BY Table1."retrieval_time" DESC) AS row_num
  FROM 
   Table1

) AS Table1
WHERE
 Table1.row_num = 1

Если вы добавите

ORDER BY Table1.num_comments ASC

, результат будет таким же.если вы заботитесь о заказе.

Результат

| reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments |
| --------- | -------------- | ------------- | ------------ | ------------ |
| 3poslo    | 1535570420     | 37            | 0.85         | 9            |
| 7klmnq    | 1534965620     | 35            | 0.75         | 5            |
| 9hdajv    | 1537471220     | 15            | 0.78         | 3            |

Демонстрация на DB Fiddle

Что если reddit_id = 9hdajv имеет несколько записей стот же retrieval_time = 1537471220 они также должны отображаться?- Raymond Nijland

Нет, просто выберите один из них, если он проскальзывает.Это не должно происходить в моем коде коллекции, и если это произойдет, мне не важно, какой из них выбран - jarcobi889

Он также обрабатывает связи, как запрошено.

Демонстрация на DB Fiddle

...