- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个如下所示的表格:
mysql> explain test_table;
+---------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-------------+------+-----+---------+-------+
| timestamp | datetime | NO | PRI | NULL | |
| id | varchar(64) | NO | PRI | NULL | |
| px_last | float | NO | | NULL | |
| twap | float | YES | | NULL | |
+---------------------+-------------+------+-----+---------+-------+
对于给定的符号和时间戳,我想将字段 twap
的值向后移动一个时间步长。
此表:
mysql> select * from test_table;
+---------------------+-------+---------+-------+
| timestamp | id | px_last | twap |
+---------------------+-------+---------+-------+
| 2011-01-01 00:00:00 | apple | 101 | 101.1 |
| 2011-01-01 00:00:00 | pear | 50 | 50.1 |
| 2011-01-02 00:00:00 | apple | 102 | 112.8 |
| 2011-01-02 00:00:00 | pear | 51 | 57.3 |
| 2011-01-03 00:00:00 | pear | 52 | 59.1 |
| 2011-01-03 00:00:00 | apple | 103 | 104.1 |
+---------------------+-------+---------+-------+
最终应该是这样的:
mysql> select * from test_table;
+---------------------+-------+---------+-------+
| timestamp | id | px_last | twap |
+---------------------+-------+---------+-------+
| 2011-01-01 00:00:00 | apple | 101 | 112.8 |
| 2011-01-01 00:00:00 | pear | 50 | 57.3 |
| 2011-01-02 00:00:00 | apple | 102 | 104.1 |
| 2011-01-02 00:00:00 | pear | 51 | 59.1 |
| 2011-01-03 00:00:00 | pear | 52 | NULL |
| 2011-01-03 00:00:00 | apple | 103 | NULL |
+---------------------+-------+---------+-------+
我的第一种方法(使用此示例: How to number rows... )是在每个符号内创建一个行号 (1, 2....n),然后将行号、符号和 twap 复制到临时表,减少临时表中每行行号加1,然后将数据复制回原表。
有没有办法在不创建临时表的情况下做到这一点?该表很大,超过 5000 万行并且还在不断增长,因此查找小于给定时间戳的最大时间戳不够高效。
最佳答案
你可以写:
UPDATE test_table tt1
SET tt1.twap =
( SELECT tt2.twap
FROM ( SELECT timestamp,
id,
twap
FROM test_table
) tt2
WHERE tt2.timestamp = DATE_ADD(tt1.timestamp, INTERVAL 1 DAY)
AND tt2.id = tt1.id
)
;
从技术上讲,这确实创建了一个临时表(作为可怕的 ERROR 1093 (HY000): You can't specify target table 'tt1' for update in FROM clause
的解决方法),但至少它都是由该内部子查询隐式处理的,而不是要求您创建一个临时表作为一个单独的步骤。
对于一个大表,我不希望它表现得很好,但是您可以通过一次仅处理一个时间范围将其分解为较小的更新(前提是您从最早的时间范围开始并向前移动,这样您就永远不会覆盖您将要使用的数据)。您的个人陈述将如下所示:
UPDATE test_table tt1
SET tt1.twap =
( SELECT tt2.twap
FROM ( SELECT timestamp,
id,
twap
FROM test_table
WHERE timestamp BETWEEN TIMESTAMP '2011-01-02 00:00:00'
AND TIMESTAMP '2011-02-01 23:59:59'
) tt2
WHERE tt2.timestamp = DATE_ADD(tt1.timestamp, INTERVAL 1 DAY)
AND tt2.id = tt1.id
)
WHERE tt1.timestamp BETWEEN TIMESTAMP '2011-01-01 00:00:00'
AND TIMESTAMP '2011-01-31 23:59:59'
;
关于MySQL:在带时间戳的行之间移动数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13633479/
给定一个带有多个 date_time 戳的字符串,我想 提取第一个戳及其前面的文本 候选字符串可以有一个或多个时间戳 后续的 date_time 戳记将被 sep="-" 隔开 后续date_time
是否可以合并从相机拍摄的文本和照片?我想在照片上标记日期和时间,但我在 Google 上找不到任何内容。 最佳答案 使用下面的代码来实现你所需要的。 Bitmap src = Bitm
有没有办法通过 Graph API 戳另一个用户?基于this post ,并使用 Graph Explorer ,我发布到“/USERID/pokes”,我已经授予它(Graph API 应用程序和
我有两个向左浮动的元素。一个是 body 的第一个 child ,另一个是容器的第一个 child ,容器是 body 的第二个 child 。 ...
我是一名优秀的程序员,十分优秀!