用于更新百分比更改的SQL语句

时间:2010-10-27 03:05:11

标签: mysql sql sql-update

我搜索了S.O.对于这个答案,已接近答案,但仍然不够接近。我很想知道MySQL是否具备此功能。

我已经在Perl和MySQL 4中开发了,现在我在使用MySQL 4。 我的桌子看起来像这样......

  • symbol varchar(25)
  • 今天日期
  • interest int(11)

我的问题是......这些符号(大约200,000个)每天都会更新一个感兴趣的新数字。

一个例子是......

symbol  | todayDate  | interest
-------------------------------
A202015 | 2010-10-26 | 150
A202015 | 2010-10-25 | 100

理想情况下,我能够做的是在最后更新另一个字段,并改变前一个记录的百分比。以上就像这样......

symbol  | todayDate  | interest | change
-----------------------------------------
A202015 | 2010-10-26 | 150      | 50
A202015 | 2010-10-25 | 100

我认为MySQL中没有这个功能。我得出的结论是,我只需要获取之前的记录信息,进行数学计算,然后使用百分比信息更新最新记录。我只是想我会仔细检查,看看是否有任何MySQL天才有任何智慧可以通过我的方式。

3 个答案:

答案 0 :(得分:2)

在与威尔基女士进行电子邮件对话之后,事实证明她想要一个像这样的百分比变化:

update t_test_1 as t1 
    set chng = (t1.interest - (
            select interest from (
                select *
                from t_test_1 as t11 
                ) as x
            where x.symbol = t1.symbol and x.todayDate < t1.todayDate 
            order by x.todayDate desc
            limit 1
            )) / 
            (
                select interest from (
                    select *
                    from t_test_1 as t11 
                ) as x2
                where x2.symbol = t1.symbol and x2.todayDate < t1.todayDate 
                order by x2.todayDate desc
                limit 1
            ) * 100 ;

答案 1 :(得分:1)

由于MySQL引用子查询的方式,它有点奇怪,但这会做你想要的我认为:

/*

create table t_test_1 (
    symbol varchar(20) not null,
    todayDate datetime not null,
    interest int not null,
    chng int null
)

*/

insert into t_test_1 (symbol, todayDate, interest, chng) values ( 'A202015', '2010-10-09', 90, null);
insert into t_test_1 (symbol, todayDate, interest, chng) values ( 'A202015', '2010-10-10', 80, null);
insert into t_test_1 (symbol, todayDate, interest, chng) values ( 'A202015', '2010-10-11', 120, null);


update t_test_1 as t1 
    set chng = t1.interest - (select interest from (
        select *
        from t_test_1 as t11 
        ) as x 
        where x.symbol = t1.symbol and x.todayDate < t1.todayDate 
        order by x.todayDate desc
        limit 1
        );


select * from t_test_1;

这导致:

A202015 2010-10-09 90   NULL
A202015 2010-10-10 80   -10
A202015 2010-10-11 120  40
哦,我应该补充一下,这是针对mysql 5.x数据库服务器的。我不确定它是否适用于4.x,因为我没有4.x服务器进行测试,抱歉。

-don

答案 2 :(得分:0)

从样本数据中我假设记录不是“更新”,而是插入新记录。

INSERT INTO `rates` (`symbol`,`todayDate`,`interest`,`change`) 
    SELECT symbol,CURDATE(),$interest,$interest - `interest` 
    FROM `rates` 
    WHERE `symbol`='$symbol' AND `todayDate` = CURDATE() - INTERVAL 1 DAY

($ interest和$ symbol是包含您要插入的值的变量,rates是表的名称 - 替换为实际值)