0

我有一个具有以下结构的mysql表

id  name_id  class_id  currency     date       value  change
1    BILL        A         0     04-01-2013    10.00    0
5    BILL        A         0     04-02-2013     9.90    0
12   FRED        A         0     04-01-2013     8.00    0
13   FRED        B         1     04-02-2013     8.50    0  
22   FRED        B         1     04-03-2013     8.51    0  

当, 和相等时,我想change根据当天的值与前一个日期值之间的差异来更新列。. . 所以在这个小摘录中,只有第 2 行将更新为,第 5 行将更新为.name_idclass_idcurrency-0.100.01

有 400,000 行,它们都有一个自动递增的 id,但这些 id 没有任何顺序。缺少周末和节假日日期,因此没有连续日期。

我似乎能够通过这样的查询来显示更改

SELECT pd.name_id,
   pd.class_id,
   pd.currency, 
   pd.date,
   pd.value,
   ROUND(pd.nav - (SELECT nav
              FROM price_data as x
              WHERE x.date       < pd.date
              AND x.name_id      = pd.name_id
              AND x.class_id     = pd.class_id
              AND x.currency     = pd.currency 
              ORDER BY price_date DESC
              LIMIT 1),5) as change
FROM price_data as pd

我试图修改它以进行更新,但我不断收到一个 mysql 错误,#1093 - You can't specify target table 'pd' for update in FROM clause即使这样我也不确定这是正确的方法。使用php会更容易吗?

UPDATE price_data as pd
SET pd.change = (
   pd.value - (SELECT value
              FROM price_data as x
              WHERE x.date       < pd.date
              AND x.fund_id      = pd.fund_id
              AND x.class_id     = pd.class_id
              AND x.currency     = pd.currency )
)

感谢您提供的任何帮助。

4

2 回答 2

0

你的任务并不容易。因此,我决定将其拆分为 2 个请求:1 个 SELECT 和 1 个 UPDATE。

该代码是用 php 编写的,并且基于您在小提琴中提供的数据:

<?php
try {
      $username = 'user';
      $password = '';
      $conn = new PDO('mysql:host=localhost;dbname=test', $username, $password);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $stmt = $conn->prepare('
SELECT pd.id,
   ROUND(pd.value - (SELECT value
              FROM price_data as x
              WHERE x.price_date       < pd.price_date
              AND x.fund_id      = pd.fund_id
              AND x.class_id     = pd.class_id
              AND x.currency_id     = pd.currency_id
ORDER BY x.price_date DESC
LIMIT 1
),5) as `change`
FROM price_data as pd
WHERE
    pd.`value_change`=0
');
      $stmt->execute();

      $result = array();
      while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            if (!is_null($row["change"]))
            {
                  var_dump($row);
                  $stmt2 = $conn->prepare('
UPDATE
    price_data
SET
    price_data.value_change=:change
WHERE
    price_data.id=:id
');
                  $stmt2->execute($row);
            }
      }


} catch(PDOException $e) {
      echo 'ERROR: ' . $e->getMessage();
}
?>

这更新了我机器上的必要记录。让我知道,它是如何在你的身上发挥作用的。

于 2013-05-21T08:02:38.023 回答
0

将日期列更新为前一天

update table set datefield = date_sub(datefield, interval 1 day) 
于 2021-09-20T10:12:14.303 回答