MYSQL выбирает последнюю запись группового охвата нескольких месяцев - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть таблица из примерно 50 тыс. Строк, в которой я хранил данные о квартальных отчетах о доходах фондового рынка за последние пару лет.Проблема в том, что компания может отложить дату своего объявления после того, как я сохраню запись (я получаю новые даты каждый вечер), и моя таблица «зарабатывать на календаре» выглядит примерно так:

id  symbol  date
48095   AEG 12/13/2018
48013   AEG 12/6/2018
47942   AEG 11/29/2018
47873   AEG 11/22/2018
47774   AEG 11/15/2018
47381   AEG 11/8/2018
45963   AEG 8/16/2018
45843   AEG 8/9/2018
45325   AEG 6/28/2018
45327   AEG 6/28/2018
45300   AEG 6/21/2018
45272   AEG 6/14/2018
45236   AEG 6/7/2018
45196   AEG 5/31/2018
45159   AEG 5/24/2018
45113   AEG 5/17/2018
45010   AEG 5/10/2018
43705   AEG 2/15/2018
42797   AEG 11/9/2017
41550   AEG 8/10/2017
40238   AEG 5/11/2017
38335   AEG 2/17/2017
36677   AEG 11/10/2016
33877   AEG 8/11/2016
30956   AEG 5/12/2016

задержка почти всегда ровно 7 дней, но это может быть 14, и я также видел задержки всего на несколько дней.Я обоснованно решил продвинуться вперед, просто проверив, существует ли дата для определенного символа в течение последних нескольких недель, и удалив ее перед вставкой новой записи, но мне нужно исправить свои исторические данные.Это то, что у меня пока есть:

SELECT max(id) as id, symbol, max(`earnings_calendar_archive`.`date`) as date
FROM earnings_calendar_archive 
GROUP BY symbol, year(`earnings_calendar_archive`.`date`),month(`earnings_calendar_archive`.`date`) 
ORDER BY symbol ASC, date DESC

Это работает довольно хорошо, но в случае задержки, охватывающей два месяца, он сохраняет обе записи:

id  symbol  date
48095   AEG 12/13/2018
47942   AEG 11/29/2018
45963   AEG 8/16/2018
45327   AEG 6/28/2018
45196   AEG 5/31/2018
43705   AEG 2/15/2018
42797   AEG 11/9/2017
41550   AEG 8/10/2017
40238   AEG 5/11/2017
38335   AEG 2/17/2017
36677   AEG 11/10/2016
33877   AEG 8/11/2016
30956   AEG 5/12/2016

Как вы можетесмотрите в результате, есть два набора строк, которые предоставляют неправильную дату объявления.Во-первых, 12/13 и 11/29, когда я хочу, чтобы оно поддерживало 12/13, и снова, когда они непрерывно откладывали объявление с 5/10 до 6/28, где я хотел бы, чтобы запрос поддерживал 6/28,Если бы я хотел отслеживать аналитику, такую ​​как производительность акций, после объявления о доходах, я получил бы неверные данные, так как в этом примере есть две даты, когда объявление о доходах не происходило.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Что-то щелкнуло для меня, когда @CaiusJard сказал: «Вы говорите, что хотите МАКСИМАЛЬНЫЙ (дата) GROUP BY квартал».Это кажется очевидным в ретроспективе, но я никогда не думал об этом.Если кто-то сталкивается с подобной проблемой, вот как я ее решил.

SELECT symbol, max(`earnings_calendar_archive`.`date`) as date
FROM earnings_calendar_archive 
GROUP BY symbol, 
year(`earnings_calendar_archive`.`date`),
quarter(`earnings_calendar_archive`.`date`) 
0 голосов
/ 16 декабря 2018

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

Если это так, то что-то вроде этого:

select eac.*
from earnings_calendar_archive eac
where not exists (select 1
                  from earnings_calendar_archive eac2
                  where eac2.symbol = eac.symbol and
                        eac2.date > eac.date and
                        eac2.date < eac.date + interval 60 day
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...