MySQL наклон (тренд) одного поля (линия наилучшего соответствия)

У меня есть простая таблица под названием LOGENTRY с полями под названием «ДАТА» и «СТОИМОСТЬ». Пример:

+--------------+-------+
| DATE         | COST  |
+--------------+-------+
| MAY 1 2013   | 0.8   |
| SEP 1 2013   | 0.4   |
| NOV 1 2013   | 0.6   |
| DEC 1 2013   | 0.2   |
+--------------+-------+

Я хотел бы найти наклон поля СТОИМОСТЬ с течением времени (выбранный диапазон строк), в результате чего НАКЛОН = -0,00216 (это эквивалентно функции НАКЛОН Excel, также известной как линейная регрессия).

Есть ли простой способ ВЫБРАТЬ наклон СТОИМОСТИ? Если я сделаю математику на вызывающем языке (php), я могу найти наклон как:

SLOPE =  (N * Sum_XY - Sum_X * Sum_Y)/(N * Sum_X2 - Sum_X * Sum_X);

Я видел несколько похожих вопросов, но они более сложные. Я пытаюсь сократить этот пример до простейшей ситуации, чтобы я мог понять ответ :) Вот так близко, как я понял... но MYSQL жалуется на синтаксис около: 'плавать)) AS Sum_X, SUM(CAST( LOGENTRY.DATE как число с плавающей запятой) * CAST(LOGENTRY.DATE'

SELECT 
  COUNT( * ) AS N, 
  SUM( CAST( LOGENTRY.DATE AS FLOAT ) ) AS Sum_X, 
  SUM( CAST( LOGENTRY.DATE AS FLOAT ) * CAST( LOGENTRY.DATE AS FLOAT ) ) AS Sum_X2, 
  SUM( LOGENTRY.COST ) AS Sum_Y, SUM( LOGENTRY.COST * LOGENTRY.COST ) AS Sum_Y2, 
  SUM( CAST( LOGENTRY.DATE AS FLOAT ) * LOGENTRY.COST ) AS Sum_XY
FROM LOGENTRY

person TSG    schedule 15.02.2013    source источник
comment
с этой информацией никто не может ответить. Когда вы когда-либо публикуете вопрос, пожалуйста, публикуйте образцы данных, структуру и желаемый результат.   -  person Muhammad Raheel    schedule 15.02.2013
comment
Возможный дубликат: stackoverflow.com/ вопросы/9084761/   -  person sgeddes    schedule 15.02.2013
comment
Я видел запись 9084761, но она сложнее (дополнительное поле KEYWORD). Я пытаюсь сделать это простым, чтобы я и другие могли лучше понять его.   -  person TSG    schedule 15.02.2013
comment
Вы отчаянно нуждаетесь в том, чтобы это было сделано в MySQL? Скорее всего, намного проще в том, что получает данные.   -  person Orbling    schedule 15.02.2013
comment
Данные возвращаются в PHP. Я думал, что всегда эффективнее делать это в SQL   -  person TSG    schedule 15.02.2013
comment
Хорошо, если объем данных огромен, в противном случае, возможно, нет.   -  person Orbling    schedule 15.02.2013
comment
Возможный дубликат: stackoverflow.com/questions/4400440 /   -  person Orbling    schedule 15.02.2013
comment
Поместите круглые скобки вокруг подвыборки в предложении FROM и поставьте запятую перед ней (чтобы разделить таблицы или использовать JOIN).   -  person Orbling    schedule 15.02.2013
comment
Взгляните на эту скрипту: sqlfiddle.com/#!2/601fa5/9 -- результат наклона отображается как 0, я думаю, из-за потери значимости мантиссы, он должен быть двойным. Поэтому я добавил к выводу числитель и знаменатель. Хотя не быстрее, чем делать то, что вы сделали в своем ответе.   -  person Orbling    schedule 15.02.2013


Ответы (1)


Кажется, что MySQL не может преобразовать дату в число с плавающей запятой (как и в других примерах в stackoverflow). Возможно, другие примеры относятся к другой базе данных. Таким образом, преобразуя даты в unix_timestamps, я могу получить ответ... с окончательным расчетом в PHP. Если это НЕПРАВИЛЬНО... пожалуйста, напишите, и я удалю ответ...

SELECT
        COUNT(*) AS N,
        SUM(UNIX_TIMESTAMP(LOGENTRY.DATE)) AS Sum_X,
        SUM(UNIX_TIMESTAMP(LOGENTRY.DATE) * UNIX_TIMESTAMP(LOGENTRY.DATE)) AS Sum_X2,
        SUM(LOGENTRY.COST) AS Sum_Y,
        SUM(LOGENTRY.COST*LOGENTRY.COST) AS Sum_Y2,
        SUM(UNIX_TIMESTAMP(LOGENTRY.DATE) * LOGENTRY.COST) AS Sum_XY
    FROM LOGENTRY
person TSG    schedule 15.02.2013
comment
Это не так уж плохо, хотя проверьте свои данные, чтобы убедиться, что вы получаете из них хороший ответ. - person Orbling; 15.02.2013