首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇总日内数据

汇总日内数据
EN

Stack Overflow用户
提问于 2014-01-08 13:41:58
回答 2查看 195关注 0票数 2

我存储了股票数据@ frame 1分钟,所以1行=1分钟,我使用这个查询来获取每天的min、max、sum、first和first记录。

我每天有511 1分钟的排(从0900到1730)。

代码语言:javascript
复制
SELECT  MAX(high), MIN(low), SUM(volume) from a2a where date = 20131202; 
SELECT open FROM a2a ORDER BY time LIMIT 1;
SELECT close FROM a2a  WHERE time = 1730 ORDER BY time DESC LIMIT 1; 

SELECT  MAX(high), MIN(low), SUM(volume) from a2a where date = 20131203; 
SELECT open FROM a2a ORDER BY time LIMIT 1;
SELECT close FROM a2a  WHERE time = 1730 ORDER BY time DESC LIMIT 1;

SELECT  MAX(high), MIN(low), SUM(volume) from a2a where date = 20131204; 
SELECT open FROM a2a ORDER BY time LIMIT 1;
SELECT close FROM a2a  WHERE time = 1730 ORDER BY time DESC LIMIT 1;

在Netbeans中,它返回9个选项卡:

我的问题是:

( 1)是否有办法在一个标签中获得这些结果?

2)我是否需要每天执行3次不同的选择,还是有办法在一个查询中完成这一任务?

3)是否有比这更快的方法来计算这些总和?发布的只是一个例子,我需要得到数以百计的每日数据。

编辑:表a2a图像。日期和时间类型为CHAR,ope关闭为双倍,卷为整数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 14:26:14

您可以使用相关子查询获得打开和关闭:

代码语言:javascript
复制
  SELECT symbol, date, MAX(high) AS high, MIN(low) as low, SUM(volume) as volume,
         (select open from a2a a2 where a1.symbol = a2.symbol and a1.date = a2.date order by time limit 1) as open,
         (select close from a2a a2 where a1.symbol = a2.symbol and a1.date = a2.date order by time desc limit 1) as close
  FROM a2a a1
  GROUP BY symbol, date
  ORDER BY symbol, date;

a2a(symbol, date, time)上的索引将加快此查询的速度。

票数 1
EN

Stack Overflow用户

发布于 2014-01-08 14:19:03

在高/低/量的情况下试试这个

代码语言:javascript
复制
 SELECT symbol,
        date,
        MAX(high)    AS dailyhigh,
        MIN(low)     AS dailylow,
        SUM(volume)  AS dailyvolume
  GROUP BY symbol, date

每个符号每天可以得到一排。

很难说你如何处理开盘价。当然,即使没有日期,整个表中的第一个时间戳也不是正确的方法。那么,让我们计算出每个日期的最早时间戳。

代码语言:javascript
复制
 SELECT symbol,
        date,
        MIN(time) AS opentime
   FROM a2a
  GROUP BY symbol, date

现在,我们需要查一下那个时间戳的开盘价。怎么做?它变得更复杂了,因为对于这个特定的时间和日期,您可能有多个行。

代码语言:javascript
复制
 SELECT a.symbol, 
        a.date,
        AVG (a.open) AS dailyopen
   FROM a2a a
       JOIN (
         SELECT symbol,
                date,
                MIN(time) AS opentime
           FROM a2a
          GROUP BY symbol, date 
        ) AS b   ON a.symbol = b.symbol 
                AND a.date = b.date
                AND a.time = b.opentime
  GROUP BY a.symbol, a.date

这将提取每个符号和日期的开始记录(最低时间记录)。

现在,在我看来,你的收尾记录是具有时间戳1730的记录,或者是时间戳小于1730的最新记录。这将从快速SQL变成真正的工作,但这些都是财务记录,麦道夫被关在监狱里,所以让我们把它做好。这是每个日期的每个符号的结束时间。

代码语言:javascript
复制
 SELECT symbol,
        date,
        MAX(time) AS closetime
   FROM a2a
  WHERE time <= 1730
  GROUP BY symbol, date

现在我们需要每个日期的每个符号的收盘价。我们将以同样的方式收回开盘价。

代码语言:javascript
复制
 SELECT a.symbol, 
        a.date,
        AVG (a.close) AS dailyclose
   FROM a2a a
       JOIN (
         SELECT symbol,
                date,
                MAX(time) AS closetime
           FROM a2a
          WHERE time <= 1730
          GROUP BY symbol, date
        ) AS b   ON a.symbol = b.symbol
                AND a.date = b.date
                AND a.time = b.closetime
  GROUP BY a.symbol, a.date

下一步是将这三个摘要查询连接在一起,并限制您正在处理的日期范围。

代码语言:javascript
复制
SELECT d.symbol, d.date, d.dailyhigh, d.dailylow, d.dailyvolume,
       o.dailyopen,
       c.dailyclose
  FROM (
      /* the first summary query, daily high low volume */
       ) AS d
  JOIN (
      /* the second summary query, daily open */ 
       ) AS o ON d.symbol = o.symbol AND d.date = o.date
  JOIN (
      /* the third summary query, daily close */ 
       ) AS c ON d.symbol = c.symbol AND d.date = c.date
 WHERE d.date >= DATE_FORMAT(NOW() - INTERVAL 3 DAY, '%Y%m%d') 
   AND d.date  < DATE_FORMAT(NOW(), '%Y%m%d')
 ORDER BY d.symbol, d.date

这将给你三天的数据,以昨天结束。您必须将三个摘要查询剪切并粘贴到这个大的胖连接中。我希望您能这样做,因为像这样格式化深度嵌套的查询没有多大乐趣。

这并不简单,但它对您的业务规则非常健壮和明确。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20997382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档