mysql 插入按日期分组的最大最小值
mysql insert max min value grouped by date
这是我的 table 架构:
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(date) 插入正确的值,但我仍然不明白如何使用 INSERT INTO。
感谢您的帮助问候。
您可以使用 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;
这是我的 table 架构:
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(date) 插入正确的值,但我仍然不明白如何使用 INSERT INTO。 感谢您的帮助问候。
您可以使用 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;