坚持SQL查询

时间:2011-12-30 23:21:10

标签: mysql sql greatest-n-per-group

我在Ubuntu 10.04上运行MYSQL 5.1.41。

我有两张桌子。包含有关一组股票的基本信息的股票,其中包含以下列:pk,name,pur_date,pur_price,avg_vol,mkt_cap。另一个表是包含股票表中股票的价格历史的数据。数据表包含以下列:pk,ticker,date,open,high,low,close,volume,adj_close。

我需要一个查询,显示股票的高价,因为它是购买日期和发生日期。

我有这个问题:

SELECT ticker, date, MAX(high)
FROM data, stocks
WHERE ticker = sym AND date > pur_date 
GROUP BY  ticker
ORDER BY ticker
LIMIT 0, 100

查询会给我每个股票高,但总是返回数据表中的最新日期,恰好是2011-12-23。如何更改查询以显示库存达到最高的日期?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

这是经典的greatest-per-group问题。一种解决方案是在子查询中查询票证的最大high

select  ticker
,       date
,       high
from    data d
join    stocks s
on      d.ticker = s.sym
where   d.date > pur_date
        and d.high = 
        (
        select  max(high)
        from    data d2
        where   d2.ticker = d.ticker
               and d2.date > pur_date
        )

有关详细讨论,请参阅Quassnoi的explain extended blog

答案 1 :(得分:0)

您最初是通过股票代码进行分组,这可能无法给出正确的预期结果,我稍后会解释。我实际上对每个购买股票进行了预查询并获得了自购买以来的最高价格......请考虑以下情况。

人士于1月1日以每股20美元的价格购买100股X股。 1月25日以每股23美元的价格买入100股,另有100股在2月18日以每股24美元的价格买入。实际数据显示,股票X在1月22日(第二次购买前)有一个高点,每股27美元,然后在1月25日23美元的时候下降......在2月份购买之前从那里下调/上调,但仅在2月27日做了它回升至每股25美元。

第一笔交易 1月1日买入的20美元将在1月22日显示27美元的高点 1月25日买入的23美元将在2月27日显示25美元的高点 2月18日买入的24美元也将在2月27日显示25美元的高位

因此,通过自动收录器分组可能不一定显示。现在,上面的方案显示,你想从这里看到所有购买的股票X全面显示高达27美元?即使最近的购买从未见过这个价格?

select 
      s2.*,
      d2.*
   from 
      ( select 
              s.pk,
              s.sym,
              max( d.high ) as HighSincePurchDay
           from
              stocks s
                 join data d
                    on s.sym = d.ticker
                   AND s.pur_date <= d.date
           group by
              s.pk
      ) PreQuery

      JOIN stocks s2
         on PreQuery.PK = s2.PK

      JOIN data d2
         on PreQuery.Sym = d.Ticker
        AND s.Pur_Date <= d.Date
        AND d.high = PreQuery.HighSincePurchDay