MYSQL选择组跨多个月的最新记录

时间:2018-12-16 18:55:28

标签: mysql sql

我有一张约有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 。如果我想跟踪盈余发布后的股票表现等分析,由于该示例中有两个日期未发生盈余发布,因此我会得到错误的数据。有什么想法吗?

2 个答案:

答案 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`)