我有一个包含以下股票数据的表格,其中有几列,例如日期、代码、开盘价和收盘价(股票价格)。
要查询此数据,我想知道哪只股票在特定日期的 margin 最高。因此,如果我有 516 只不同的股票,我的查询应该返回 516 行代码、日期、开盘价、收盘价和一个新列 Margin(这将是 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 |
我写了一个查询,我的方法是:
- 第 1 步 - 获取收盘价和开盘价之间的差值(内部/子查询)
- 第 2 步 - 获取每只股票的最大 margin (使用 group by 和 max 函数)
- 第 3 步 - 将结果与主表合并并获取数据。
我会将我的查询放在解决方案或评论中,有人可以更正它吗,因为它需要更多时间。我也想知道我们是否还有其他替代方法。
最佳答案
如前所述,请参阅以下查询:
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;
对于这个查询,我们是否有任何其他替代方案,或者是否有可能对其进行优化。
关于sql - 如何优化嵌套的内部配置单元查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46979847/