Как ВЫБРАТЬ значение таблицы MySQL, которое не было обновлено на определенную дату? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть база данных MySQL с именем mydb, в которой я храню ежедневные цены на акции для 423 компании в таблице назвали данные. Данные таблицы имеют следующие столбцы:

`epic`, `date`, `open`, `high`, `low`, `close`, `volume`

epic и date - пары первичных ключей. Я обновляю таблицу данных каждый день, используя файл CSV, который обычно имеет 423 строки все данные имеют одинаковую дату. Однако в некоторые дни цены могут быть недоступны для всех 423 компаний и данных для конкретной пары эпос и дата будут не обновляться Для определения пропавшей пары я прибег к для сравнения полного списка эпопей с неполным списком эпопей с использованием два простых запроса SELECT с разными датами, а затем с помощью файлового компаратора, таким образом выявление пропавшего эпоса (ов). Это не очень удовлетворительное решение и пока Я не смог построить запрос, который бы идентифицировал любые эпические не обновлялись ни на один конкретный день.

SELECT `epic`, `date` FROM `data`
WHERE `date` IN ('2019-05-07', '2019-05-08')
ORDER BY `epic`, `date`;

Создает пары значений:

`epic`  `date`
"3IN"   "2019-05-07"
"3IN"   "2019-05-08"
"888"   "2019-05-07"
"888"   "2019-05-08"
"AA."   "2019-05-07"
"AAL"   "2019-05-07"
"AAL"   "2019-05-08"

Где в этом случае АА. не обновлялся 2019-05-08. Проблема в том, что не легко определить значение, которое не является парой. Любая помощь с этой проблемой будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Если вы хотите проверить только последнюю загруженную дату, следующее вернет каждый элемент, не обновленный в 2019-05-08:

SELECT last_updated.epic, last_updated.date
FROM (
SELECT epic , max(`date`) AS date FROM `data`
GROUP BY 'epic'
) AS last_updated
WHERE 'date' <> '2019-05-08'
ORDER BY 'epic'
;

или для любой даты загрузки, следующее будет сравниваться со всей базой данных, поэтому вы не полагаетесь на «2019-08-07», имеющую каждую эпическую строку. То есть если эпопея была в базе данных ранее, то она будет отображаться, если не обновлена:

SELECT d.epic, max(d.date)
FROM data as d
WHERE d.epic NOT IN (
   SELECT d2.epic 
   FROM data as d2 
   WHERE d2.date = '2019-05-08'
)
GROUP BY d.epic
ORDER BY d.epic
0 голосов
/ 10 мая 2019

Вы можете сделать COUNT на эпосе с GROUP BY эпосом для предметов в этом диапазоне дат и посмотреть, получите ли вы с COUNT меньше 2, а затем выбрать из этого результата, где UpdateCount меньше чем 2, простите, если синтаксис в именах столбцов не верен, я работаю в SQL Server, но логика для запроса все еще должна работать для вас.

SELECT x.epic
FROM
(
    SELECT COUNT(*) AS UpdateCount, epic
    FROM data
    WHERE date IN ('2019-05-07', '2019-05-08')
    GROUP BY epic
) AS x
WHERE x.UpdateCount < 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...