Оператор SQL для обновления процентного изменения - PullRequest
3 голосов
/ 27 октября 2010

Я искал SO для этого ответа и приблизился к ответу, но все еще не достаточно близко.Мне интересно знать, есть ли у MySQL такая возможность.

Я разработал на Perl и MySQL 4 и сейчас нахожусь на MySQL 4.Моя таблица выглядит следующим образом ...

  • символ varchar (25)
  • todayDate date
  • интереса 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 ]

2 голосов
/ 01 ноября 2010

После разговора по электронной почте с г-жой Уилки выяснилось, что она хотела процентного изменения следующим образом:

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 голос
/ 27 октября 2010

Это немного странно из-за способа, которым 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

0 голосов
/ 27 октября 2010

Исходя из данных примера, я предполагаю, что записи не «обновляются», а вставляются новые записи.

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

($ интереса и $ символа - переменные, содержащие значения, которые вы вставляете, rates - название таблицы - заменить фактическими значениями)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...