mysql插入按日期分组的最大最小值

时间:2017-04-04 14:24:40

标签: mysql sql select insert-into

这是我的表架构:

mysql> describe stocks;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| symbol    | varchar(32) | NO   |     | NULL    |                |
| date      | datetime    | NO   |     | NULL    |                |
| value     | float(10,3) | NO   |     | NULL    |                |
| contracts | int(8)      | NO   |     | NULL    |                |
| open      | float(10,3) | NO   |     | NULL    |                |
| close     | float(10,3) | NO   |     | NULL    |                |
| high      | float(10,3) | NO   |     | NULL    |                |
| low       | float(10,3) | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)

我添加了两个名为high和low的新列,因此它们现在是空的。

我的目标是根据每个日期填充相对最大值(值),分钟(值)的列!

我的第一个见解就是这个问题:

select distinct DATE(date),max(value) as max,min(value) as min from stocks GROUP BY DATE(date);

...

| 2017-02-20 | 19130.000 | 18875.000 |
| 2017-02-21 | 19170.000 | 18780.000 |
| 2017-02-22 | 19125.000 | 18745.000 |
| 2017-02-23 | 18980.000 | 18765.000 |
| 2017-02-24 | 18840.000 | 18505.000 |
+------------+-----------+-----------+

实现第一步,现在我应该将这些结果与每行结合起来:

| 900363 | FIB7C  | 2017-02-20 17:49:44 | 18930.000 |         1 | 0.000 | 0.000 | 0.000 | 0.000 |

并根据DATE(日期)插入正确的值,但我仍然没有注意到INSERT INTO。 谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用join中的update以及聚合来计算值:

update stocks s join
       (select date(date) as d, max(value) as dhigh, min(value) as dlow
        from stocks s
        group by date(date)
       ) sd
       on date(s.date) = sd.d
    set s.high = sd.dhigh, 
        s.low = sd.dlow;