Mysql найти количество элементов, используя предыдущие строки - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть таблица с сотнями itemname

   +--------+----------+-----------+
   | date   | itemname | itemvalue |
   +--------+----------+-----------+
   |2020-01 |    A     |    foo    |
   +--------+----------+-----------+
   |2020-01 |    A     |    foo1   |
   +--------+----------+-----------+
   |2020-02 |    B     |    bar    |
   +--------+----------+-----------+
   |2020-02 |    B     |    bar1   |
   +--------+----------+-----------+
   |2020-02 |    B     |    bar2   |
   +--------+----------+-----------+
   |2020-03 |    A     |    foo2   |
   +--------+----------+-----------+
   |2020-04 |    C     |    baz    |
   +--------+----------+-----------+
   |2020-04 |    C     |    baz1   |
   +--------+----------+-----------+
   |2020-05 |    B     |    bar3   |
   +--------+----------+-----------+
   |2020-05 |    B     |    bar4   |
   +--------+----------+-----------+

Я хочу, чтобы вывод был

   +--------+----------+-----------+
   | date   | itemname | itemcount |
   +--------+----------+-----------+
   |2020-01 |    A     |    2      |
   +--------+----------+-----------+
   |2020-02 |    B     |    3      |
   +--------+----------+-----------+
   |2020-03 |    A     |    3      | //1+2
   +--------+----------+-----------+
   |2020-04 |    C     |    2      |
   +--------+----------+-----------+
   |2020-05 |    B     |    5      | //2+3
   +--------+----------+-----------+

Я пытался group by date, itemname, но это давало мне счет только в месяц. Но проблема, с которой я столкнулся, заключается в том, как объединить COUNT itemvalue с предыдущим месяцем itemvalue. Например: в 2020-03 гг. Значение представляет собой подсчет текущих (1) + предыдущих месяцев (2)

Я использую Mysql 5.7

1 Ответ

3 голосов
/ 30 апреля 2020

В MySQL 8+ вы можете использовать оконные функции:

select date, itemname, sum(count(*)) over (partition by itemname order by date) 
from t
group by date, itemname;

Если ваши данные не очень большие, то разумным решением является коррелированный подзапрос:

select di.*,
       (select count(*) from t where t.itemname = di.itemname and t.date <= di.date) running
from (select distinct date, itemname from t) di
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...