Функция линейного уравнения с MySQL? - PullRequest
2 голосов
/ 14 апреля 2011

Я хочу вычислить оценки для некоторых данных, которые у меня есть в базе данных MySQL.Счет будет рассчитываться следующим образом:

score = COUNT(purchases MADE BETWEEN NOW() AND (NOW() - 1 WEEK))
  + 0.7 * COUNT(purchases MADE BETWEEN (NOW() - 1 WEEK) AND (NOW() - 2 WEEKS))
  + 0.4 * COUNT(purchases OLDER THAN (NOW() - 2 WEEKS))

У меня есть покупки в таблице со столбцом purchase_time.

Возможно ли сделать это в MySQL и получить вывод, подобный следующему?

ORDER_ID    SCORE
   3          8
   4          3
   5          15

Спасибо

--- EDIT --- Структура таблицы:

tblOrder - table
id - primary key
created - time stamp

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011
SELECT  orderId,
        SUM
        (
        CASE
        WHEN purchase_date > NOW() - INTERVAL 1 WEEK AND purchase_date <= NOW() THEN
                1
        WHEN purchase_date > NOW() - INTERVAL 2 WEEK AND purchase_date <= NOW() - INTERVAL 1 WEEK THEN
                0.7
        ELSE
                0.3
        END
        )
FROM    mytable
GROUP BY
        orderId
0 голосов
/ 14 апреля 2011

Ваш возраст должен быть преобразован в CASE .

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

В то же время вы можете переписать выражение так, чтобы конкретные случаи были такими факторами, как

SELECT SUM(
         CASE DATEDIFF(now(),purchase_datetime) DIV 7
           WHEN 0 THEN 1
           WHEN 1 THEN 0.7
           ELSE 0.4
         END
       )
FROM table
WHERE purchase_datetime < now()
GROUP BY ORDER_ID
0 голосов
/ 14 апреля 2011
SELECT order_id, sum(score) FROM
( 
  (SELECT Order_id, COUNT(id) AS Score FROM purchases 
    WHERE purchase_time BETWEEN CURDATE() AND DATE_SUB(CURDATE(),INTERVAL 1 WEEK))
    GROUP BY order_id
  UNION ALL
    (SELECT Order_id, (COUNT(id) * 0.7) AS score FROM purchases
    WHERE purchase_time BETWEEN DATE_SUB(CURDATE(),INTERVAL 1 WEEK) 
                    AND DATE_SUB(CURDATE(),INTERVAL 2 WEEK))
    GROUP BY order_id 
  UNION ALL
    (SELECT Order_id, (COUNT(id) * 0.4) AS score FROM purchases
    WHERE purchase_time < DATE_SUB(CURDATE(),INTERVAL 2 WEEK)) 
    GROUP BY order_id
) s
GROUP BY order_id;
0 голосов
/ 14 апреля 2011
SELECT ORDER ID, COUNT(purchases MADE BETWEEN NOW() AND (NOW() - 1 WEEK))
+ 0.7 * COUNT(purchases MADE BETWEEN (NOW() - 1 WEEK) AND (NOW() - 2 WEEKS))
+ 0.4 * COUNT(purchases OLDER THAN (NOW() - 2 WEEKS)) AS SCORE
FROM TABLE

должно сработать, у меня в настоящее время не установлен mysql, поэтому я не могу его протестировать.

также используйте datediff , чтобы узнать, находится ли дата междудиапазон дат

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