Вычтите значения продукта на основе двух последовательных дат и продукта, верните новый столбец, называемый значениями разности продуктов, в MySQL - PullRequest
1 голос
/ 05 апреля 2020

У меня есть таблица ниже.

enter image description here

Теперь мне нужен вывод, как показано ниже.

enter image description here

Теперь мне нужно отобразить различия продуктов между последовательными датами в зависимости от группы продуктов. Например: в Apple l oop первая строка должна возвращать значение по умолчанию 3, а затем следующая строка должна возвращать значение разницы. Точно так же код должен работать для следующего продукта Samsung l oop. Затем результат должен быть передан в новый столбец, как показано в требуемом выводе.

Я совершенно новичок в MySQL, однако я старался изо всех сил использовать соединение, чтобы получить желаемый результат, но я понятия не имею, с чего начать. Пожалуйста, ознакомьте меня с этой новой концепцией.

Ниже приведен мой код, который я пробовал.

CREATE TABLE products (
id  numeric,
product text,
date_value DATE,
prod_value numeric);

INSERT INTO products(id, product, date_value, prod_value)
VALUES(1, 'Apple', '2018-01-22', 3);

INSERT INTO products(id, product, date_value, prod_value)
VALUES(2, 'Apple', '2018-01-23', 6);

INSERT INTO products(id, product, date_value, prod_value)
VALUES(3, 'Apple', '2018-01-24', 7);

INSERT INTO products(id, product, date_value, prod_value)
VALUES(4, 'Samsung', '2018-01-22', 1);

INSERT INTO products(id, product, date_value, prod_value)
VALUES(5, 'Samsung', '2018-01-23', 5);

SELECT
      current.prod_value,(current.prod_value - previous.prod_value) diff
FROM
      products previous
JOIN 
      products current
ON
      current.id = previous.id+1;

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Использование lag():

select p.*,
       (p.prod_value -
        lag(p.prod_value, 1, 0) over (partition by product order by date_value)
       ) as prod_diff
from products p;
1 голос
/ 05 апреля 2020

Вы можете использовать коррелированный подзапрос (для более старой версии), если вы используете более новую версию MySQL, тогда вы можете использовать lag():

select p.*, 
       p.prodvalue - (select coalesce(p2.prodvalue, 0)
                      from product p1
                      where p1.product = p.product and p1.id < p.id
                            order by p1.id desc
                      limit 1
                     ) as proddiff
from product p;
...