如何优化嵌套的内置hive查询

时间:2017-10-27 16:42:23

标签: sql hadoop hive

我有一张包含以下股票数据的表格,其中我们有几个列,如日期,股票代码,开盘价和收盘价(股票价格)。

要查询此数据,我想知道哪个股票在特定日期给出了最高保证金。因此,如果我有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              |

我写了一个查询,我的方法是:

  • 第1步 - 获取收盘价和开盘价之间的差价(内/子查询)
  • 步骤2 - 获取每个股票的最大保证金(使用最大功能的用户组)
  • 步骤3 - 使用主表加入结果并获取数据。

我会将我的查询放在解决方案或评论中,有人可以纠正它,因为它需要更多时间。另外我想知道我们可以有任何其他替代方法。

1 个答案:

答案 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;

此查询是否有其他替代方法,或者可以对其进行优化。