我有一张约有5万行的表格,其中存储了过去几年来股票市场每季度的收入公布日期。问题是公司在存储记录后可能会延迟其公告日期(我每晚都会提取新日期),而我的“ earnings_calendar_archive”表最终看起来像这样:
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 。如果我想跟踪盈余发布后的股票表现等分析,由于该示例中有两个日期未发生盈余发布,因此我会得到错误的数据。有什么想法吗?
答案 0 :(得分:0)
我能弄清的最好的一点是,您想要记录两个月左右没有后续记录的记录。
如果是这样,则类似这样:
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
);
答案 1 :(得分:0)
@CaiusJard说:“您是说要MAX(date)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`)