首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据最近小邻居的值更新值

根据最近小邻居的值更新值
EN

Stack Overflow用户
提问于 2017-06-30 13:10:27
回答 2查看 29关注 0票数 1

我有一个列A为INT(11)的表(这是一个时间戳,但现在我只使用小数字)

代码语言:javascript
复制
id |  A | diff |
---+----+------+
 1 | 12 |      |
 2 |  7 |      |
 3 | 23 |      |
 4 |  9 |      |
 5 |  2 |      |
 6 | 30 |      |

我喜欢用diff更新A最近的小邻居之间的区别。所以,如果是A=12,它的第一个小邻居是A=7,如果A=30A=23。我应该得到这样一张桌子(按A排序):

代码语言:javascript
复制
id |  A | diff |
---+----+------+
 5 |  2 |  -   |
 2 |  7 |  5   | (7-5)
 4 |  9 |  2   | (9-7)
 1 | 12 |  3   | (12-9)
 3 | 23 | 11   | (23-12)
 6 | 30 |  7   | (30-23)

我可以在插入时计算出差异,就像我当时知道的A (这里:A=15):

代码语言:javascript
复制
INSERT INTO `table` (`A`,`diff`)
    (SELECT 15 , 15-`A` FROM `table` WHERE `A` < 15 ORDER BY `A` DESC LIMIT 1)

这导致了一项新的记录:

代码语言:javascript
复制
id |  A | diff |
---+----+------+
 7 | 15 |  3   |   (3 being the difference between A=12 and A=15

(注意:当A=1是新的最小值,没有更小的邻居,所以没有diff的值时,A=1就失败了)

但是现在diff在记录3中的值是错误的,因为它仍然是基于23 - 12之间的差异(现在应该是23 - 15 )。

因此,我只想插入A值,然后在表上运行一个更新,在必要的地方刷新diff。但这就是我对MYSQL的了解.

我构建了这个查询,但是它失败地说:“您不能指定表't1‘以便在FROM子句中进行更新

代码语言:javascript
复制
UPDATE `table` AS t1
SET 
t1.`diff` = t1.`A` - (SELECT `A` FROM `table` 
                      WHERE `A` < t1.`A` 
                  ORDER BY `A` DESC LIMIT 1
                  ) 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-30 13:18:08

下面是一个查询:

代码语言:javascript
复制
SELECT x.*
     , x.a-MAX(y.a) diff 
  FROM my_table x 
  LEFT 
  JOIN my_table y  
    ON y.a < x.a 
 GROUP 
    BY x.id 
 ORDER 
    BY a;

我不知道你为什么要存储派生数据,但我可以猜.

代码语言:javascript
复制
UPDATE my_table m
  JOIN 
     ( SELECT x.*
            , x.a-MAX(y.a) q
         FROM my_table x 
         JOIN my_table y 
           ON y.a < x.a 
        GROUP 
           BY x.id
     ) n
    ON n.id = m.id 
   SET m.diff = q;
票数 2
EN

Stack Overflow用户

发布于 2017-06-30 14:19:43

在插入新值之后,您可以尝试这样做:

代码语言:javascript
复制
UPDATE x
SET
x.diff = iq2.new_diff 
FROM
#t x
 INNER JOIN
   (SELECt id,A,diff , new_diff 
     FROM
     (select id,A,15 as new_number, 
             CASE WHEN (A-15) < 0 THEN NULL ELSE (A-15) END as new_diff,diff 
      from #t
     ) iq
   WHERE 
   iq.new_diff <= iq.diff 
   AND iq.new_diff <> 0
  )iq2
on x.A = iq2.A

内部查询比较以前的差异和当前的差异,然后更新相关的差异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44847326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档