我有一张包含以下股票数据的表格,其中我们有几个列,如日期,股票代码,开盘价和收盘价(股票价格)。
要查询此数据,我想知道哪个股票在特定日期给出了最高保证金。因此,如果我有516种不同的股票,我的查询应该返回516行的股票代码,日期,开盘价,收盘价和新的柱保证金(这将是 max(close-open))。
| deep_stocks.date_ | deep_stocks.ticker | deep_stocks.open | deep_stocks.close |
+--------------------+---------------------+-------------------+--------------------+--+
| 20100721 | A | 27.68 | 27.58 |
| 20100722 | A | 27.95 | 28.72 |
| 20100723 | A | 28.56 | 29.3 |
| 20100726 | A | 29.22 | 29.64 |
| 20100727 | A | 29.73 | 28.87 |
| 20100728 | A | 28.79 | 28.78 |
| 20100729 | A | 28.97 | 28.15 |
| 20100730 | A | 27.78 | 27.93 |
| 20100802 | A | 28.35 | 28.82 |
| 20100803 | A | 28.7 | 27.84 |
我写了一个查询,我的方法是:
我会将我的查询放在解决方案或评论中,有人可以纠正它,因为它需要更多时间。另外我想知道我们可以有任何其他替代方法。
答案 0 :(得分:1)
正如已经讲过我的方法,请找到以下查询:
SELECT ds.ticker, ds.date_, ds.close, ds.open, ds.Margin FROM
(SELECT ticker, date_, close, open, case(close-open)>0 when true then round(close-open,2) else 0 end as Margin FROM DataStocks) ds
JOIN
(SELECT dsIn.ticker, max(dsIn.Margin) mxMargin FROM
(select ticker, case(close-open)>0 when true then round(close-open,2) else 0 end as Margin FROM DataStocks ) dsIn group by dsIn.ticker) dsEx
ON ds.ticker=dsEx.ticker AND ds.Margin=dsEx.mxMargin ORDER BY ds.Margin;
此查询是否有其他替代方法,或者可以对其进行优化。