Как выбрать МАКС (дата) после определенной даты - PullRequest
0 голосов
/ 15 октября 2018

Справочная информация:

Я пишу скрипт Python для получения некоторых данных.У меня есть 2 таблицы engine_hours и machines в базе данных SQL.Я хочу получить последние полученные данные, полученные за последние 2 дня (что делается с помощью этого date_recorded >=).

Таблицы:

Первыйтаблица:

engine_hours
=============
machine_id       
date_recorded
value

Вторая таблица:

machines
========
id
title

Пример таблицы данных:

Первая таблица:

                    engine_hours
==================================================
 machine_id  |      date_recorded       | value
-------------+--------------------------+---------       
     1       |   16/10/2018  20:30:02   |   10
     3       |   16/10/2018  19:02:32   |   42
     2       |   16/10/2018  20:32:56   |   13
     2       |   16/10/2018  19:23:23   |   12
     1       |   16/10/2018  16:54:59   |   10
     1       |   16/10/2018  16:52:59   |   10
     1       |   14/10/2018  10:24:59   |   10

Вторая таблица:

    machines
==================
  id  |   title
------+-----------   
   1  |  ABC-123
   2  |  DEF-456  
   3  |  GHI-789

Желаемый результат:

=============================================================
 machine_id  |  title  |       date_recorded      | value    
     1       | ABC-123 |   16/10/2018  20:30:02   |   10
     2       | DEF-456 |   16/10/2018  20:32:56   |   13
     3       | GHI-789 |   16/10/2018  19:02:32   |   42

Что я пробовал:

Я пробовал 4 разных запроса, но с треском провалился:

engine_hours_query = "SELECT ma.`title`, eh.`machine_id`, eh.`value`, eh.`date_recorded` " \
                     "FROM `engine_hours` AS eh inner join `machines` AS ma " \
                     "WHERE eh.`machine_id` IN ({}) AND eh.`date_recorded` >=  \"{}\" " \
                     " AND eh.`machine_id` = ma.`id`".format(", ".join([str(m_id) for m_id in list_of_machine_ids]),
                                                             cut_off_date)

engine_hours_query_2 = "SELECT `machine_id`, `value`, `date_recorded` FROM `engine_hours` AS eh " \
                       "WHERE `date_recorded` = ( SELECT MAX(`date_recorded`) " \
                       "FROM `engine_hours` AS eh2  " \
                       "WHERE eh.`machine_id` = eh2.`machine_id`)"


engine_hours_query_3 = "SELECT `machine_id`, `value`, `date_recorded` FROM `engine_hours` AS eh " \
                       "WHERE `date_recorded` = ( SELECT MAX(`date_recorded`) " \
                       "FROM `engine_hours` AS eh2 ) " \
                       "WHERE eh.`date_recorded` >=  \"{}\"".format(cut_off_date)

engine_hours_query_4 = "SELECT ma.`title`, eh.`machine_id`, eh.`value`, eh.`date_recorded` " \
                     "FROM `engine_hours` AS eh inner join `machines` AS ma " \
                     "WHERE eh.`machine_id` IN ({}) AND eh.`date_recorded` >=  \"{}\" " \
                     " AND eh.`machine_id` = ma.`id`".format(", ".join([str(m_id) for m_id in list_of_machine_ids]),
                                                             cut_off_date)

Исследование:

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Эта версия должна делать то, что вы хотите:

SELECT eh.machine_id, eh.value, eh.date_recorded
FROM engine_hours eh
WHERE eh.date_recorded = (SELECT MAX(eh2.date_recorded)
                          FROM engine_hours eh2
                          WHERE eh.machine_id = eh2.machine_id
                         );

Возможно, вы захотите добавить AND eh.date_recorded >= NOW() - INTERVAL 2 DAY, если это условие все еще необходимо.

0 голосов
/ 15 октября 2018

Вы хотите выбрать максимальную дату из подмножества данных.Критерием для подмножества является то, что он имеет дату_записки, превышающую 2 дня назад

SELECT MAX(eh.`date_recorded`)
FROM `engine_hours` eh
WHERE eh.`date_recorded` >= DATE_SUB(NOW(), INTERVAL 2 DAY);

В зависимости от сложности ваших требований, вам может потребоваться перейти к использованию подзапросов, но сейчас ГДЕпредложение происходит перед операцией MAX, поэтому этот запрос ограничивает все ваши данные только за последние 2 дня, а затем выдает в нем дату MAX

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