Справка по функциям Windows в mysql?

#mysql

Вопрос:

 Input: 
Activity table:
 ----------- ----------- ------------ -------------- 
| player_id | device_id | event_date | games_played |
 ----------- ----------- ------------ -------------- 
| 1         | 2         | 2016-03-01 | 5            |
| 1         | 2         | 2016-05-02 | 6            |
| 1         | 3         | 2017-06-25 | 1            |
| 3         | 1         | 2016-03-02 | 0            |
| 3         | 4         | 2018-07-03 | 5            |
 ----------- ----------- ------------ -------------- 
Output: 
 ----------- ------------ --------------------- 
| player_id | event_date | games_played_so_far |
 ----------- ------------ --------------------- 
| 1         | 2016-03-01 | 5                   |
| 1         | 2016-05-02 | 11                  |
| 1         | 2017-06-25 | 12                  |
| 3         | 2016-03-02 | 0                   |
| 3         | 2018-07-03 | 5                   |
 ----------- ------------ --------------------- 
 

Я пытаюсь подсчитать совокупную сумму за игры, в которые играл этот игрок в date asc.

 select player_id, event_date, sum(games_played) over(partition by player_id order by event_date) as games_played_so_far
from Activity a
order by player_id
 

Я не могу понять, как оконная функция с суммой возвращает требуемый вывод.

Например, за(раздел по идентификатору игрока , упорядоченный по дате события), разве это не возвращает идентификатор игрока= 1 в одной группе, отсортированной по дате, а затем, указывая сумму, должно возвращать общую дату правильно? Но здесь это дает совокупную сумму. Пожалуйста, внесите некоторую ясность

Комментарии:

1. dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html

Ответ №1:

Выражение

 sum(games_played) over (partition by player_id order by event_date)
 

определяет окно как группу записей от самой ранней event_date до текущей записи, по которой упорядочивается группа записей event_date . Таким образом, он генерирует совокупную сумму количества сыгранных игр. Это PARTITION условие означает, что каждый набор записей игроков будет иметь отдельную совокупную сумму.

Комментарии:

1. Я имею в виду, не делит по действиям группу. например, идентификатор игрока 1 будет одним разделом, а идентификатор игрока 2-другим разделом. Итак, когда мы применяем sum, разве он не должен возвращать окончательную сумму всем записям?

2. это потому, что мы используем порядок по дате, который снова разделяет раздел на основе текущей даты и предыдущих дат?

3. Указание PARTITION предложения означает, что каждая запись в каждом разделе будет иметь свое собственное отдельное окно. Без PARTITION , весь стол получает одно окно. Удаление этого ORDER BY предложения означало бы, что сумма будет равна для всего раздела, для каждой записи в разделе.

Ответ №2:

Если бы я получил это r

Давайте посмотрим последнюю часть оконной функции sum

 over(partition by player_id order by event_date)
 
  • часть «разбиение на» означает «снова начать вычисления с 0».
  • «заказать по» означает «вот что следует добавлять от строки к строке

Если часть «порядок по» отсутствует, база данных не знает, как рассчитать сумму от шага к шагу, поэтому она просто вычислит сумму для всей группы (раздел по предложению) и покажет ее для каждой строки этой группы

смотрите dbfiddle здесь