【问题标题】:mysql insert max min value grouped by datemysql插入按日期分组的最大值最小值
【发布时间】:2017-04-04 14:24:39
【问题描述】:

这是我的表架构:

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 的新列,因此它们现在是空的。

我的目标是用基于每天的相对 max(value),min(value) 填充这些列!

我的第一个见解是这个查询:

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(date) 插入正确的值,但我仍然无法理解 INSERT INTO。 感谢您的帮助。

【问题讨论】:

    标签: mysql sql select insert-into


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 非常感谢,它运行良好。我只修改加入匹配 -> DATE(s.date) = sd.d.
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多