Расчет скользящего бюджета - PullRequest
0 голосов
/ 14 марта 2019

У меня есть стол, который я собрал для своего фэнтезийного проекта бейсбола.Это выглядит так (это только для первых 24 строк. 24 после - для Команды 2, затем Команды 3 и т. Д.):

+--------+--------------------+--------+------+
|  team  |        name        | salary | year |
+--------+--------------------+--------+------+
| Team 1 | Corey Kluber       |     47 | 2018 |
| Team 1 | Manny Machado      |     46 | 2018 |
| Team 1 | Rhys Hoskins       |     28 | 2018 |
| Team 1 | Jose Quintana      |     27 | 2018 |
| Team 1 | Buster Posey       |     27 | 2018 |
| Team 1 | Edwin Encarnacion  |     22 | 2018 |
| Team 1 | Khris Davis        |     16 | 2018 |
| Team 1 | Marcus Stroman     |     14 | 2018 |
| Team 1 | Ian Kinsler        |      7 | 2018 |
| Team 1 | Felipe Vazquez     |      6 | 2018 |
| Team 1 | Jeff Samardzija    |      4 | 2018 |
| Team 1 | Michael Wacha      |      2 | 2018 |
| Team 1 | Ender Inciarte     |      2 | 2018 |
| Team 1 | Andrelton Simmons  |      2 | 2018 |
| Team 1 | Adam Wainwright    |      1 | 2018 |
| Team 1 | Matt Moore         |      1 | 2018 |
| Team 1 | Mike Foltynewicz   |      1 | 2018 |
| Team 1 | Cam Bedrosian      |      1 | 2018 |
| Team 1 | Joe Musgrove       |      1 | 2018 |
| Team 1 | Aaron Altherr      |      1 | 2018 |
| Team 1 | Trevor Story       |      1 | 2018 |
| Team 1 | Marcus Semien      |      1 | 2018 |
| Team 1 | Ryon Healy         |      1 | 2018 |
| Team 1 | Tim Beckham        |      1 | 2018 |
+--------+--------------------+--------+------+

Каждая команда начинает проект с бюджетом$ 260.Я надеюсь увидеть закономерности того, как исторические команды проводили.Таким образом, ожидаемый результат этого будет выглядеть следующим образом:

+--------+--------------------+--------+------+----------------+
|  team  |        name        | salary | year | rolling_budget |
+--------+--------------------+--------+------+----------------+
| Team 1 | Corey Kluber       |     47 | 2018 |            213 |
| Team 1 | Manny Machado      |     46 | 2018 |            167 |
| Team 1 | Rhys Hoskins       |     28 | 2018 |            139 |
| Team 1 | Jose Quintana      |     27 | 2018 |            112 |
| Team 1 | Buster Posey       |     27 | 2018 |             85 |
| Team 1 | Edwin Encarnacion  |     22 | 2018 |             63 |
| Team 1 | Khris Davis        |     16 | 2018 |             47 |
| Team 1 | Marcus Stroman     |     14 | 2018 |             33 |
| Team 1 | Ian Kinsler        |      7 | 2018 |             26 |
| Team 1 | Felipe Vazquez     |      6 | 2018 |             20 |
| Team 1 | Jeff Samardzija    |      4 | 2018 |             16 |
| Team 1 | Michael Wacha      |      2 | 2018 |             14 |
| Team 1 | Ender Inciarte     |      2 | 2018 |             12 |
| Team 1 | Andrelton Simmons  |      2 | 2018 |             10 |
| Team 1 | Adam Wainwright    |      1 | 2018 |              9 |
| Team 1 | Matt Moore         |      1 | 2018 |              8 |
| Team 1 | Mike Foltynewicz   |      1 | 2018 |              7 |
| Team 1 | Cam Bedrosian      |      1 | 2018 |              6 |
| Team 1 | Joe Musgrove       |      1 | 2018 |              5 |
| Team 1 | Aaron Altherr      |      1 | 2018 |              4 |
| Team 1 | Trevor Story       |      1 | 2018 |              3 |
| Team 1 | Marcus Semien      |      1 | 2018 |              2 |
| Team 1 | Ryon Healy         |      1 | 2018 |              1 |
| Team 1 | Tim Beckham        |      1 | 2018 |              0 |
+--------+--------------------+--------+------+----------------+

Как бы я пришел к этому?

РЕДАКТИРОВАТЬ: После выполнения запроса Гордона:

select t.*,
       260 - sum(salary) over (partition by team, year order by salary desc) as rolling_budget
from t;

Itприближается, но все еще не выполняет вполне того, что ему нужно, поскольку результаты выглядят следующим образом (rolling_budget представляет то, что дают результаты из вышеприведенного запроса, correct_budget - то, что должно быть:

+--------+--------------------+--------+----------+------+----------------+----------------+
|  team  |        name        | salary | position | year | rolling_budget | correct_budget |
+--------+--------------------+--------+----------+------+----------------+----------------+
| Team 1 | Corey Kluber       |     47 | P        | 2018 |            213 |            213 |
| Team 1 | Manny Machado      |     46 | 3B       | 2018 |            167 |            167 |
| Team 1 | Rhys Hoskins       |     28 | 1B,OF    | 2018 |            139 |            139 |
| Team 1 | Jose Quintana      |     27 | P        | 2018 |             85 |            112 |
| Team 1 | Buster Posey       |     27 | 1B,C     | 2018 |             85 |             85 |
| Team 1 | Edwin Encarnacion  |     22 | 1B       | 2018 |             63 |             63 |
| Team 1 | Khris Davis        |     16 | OF       | 2018 |             47 |             47 |
| Team 1 | Marcus Stroman     |     14 | P        | 2018 |             33 |             33 |
| Team 1 | Ian Kinsler        |      7 | 2B       | 2018 |             26 |             26 |
| Team 1 | Felipe Vazquez     |      6 | P        | 2018 |             20 |             20 |
| Team 1 | Jeff Samardzija    |      4 | P        | 2018 |             16 |             16 |
| Team 1 | Ender Inciarte     |      2 | OF       | 2018 |             10 |             14 |
| Team 1 | Michael Wacha      |      2 | P        | 2018 |             10 |             12 |
| Team 1 | Andrelton Simmons  |      2 | SS       | 2018 |             10 |             10 |
| Team 1 | Matt Moore         |      1 | P        | 2018 |              0 |              9 |
| Team 1 | Joe Musgrove       |      1 | P        | 2018 |              0 |              8 |
| Team 1 | Cam Bedrosian      |      1 | P        | 2018 |              0 |              7 |
| Team 1 | Mike Foltynewicz   |      1 | P        | 2018 |              0 |              6 |
| Team 1 | Adam Wainwright    |      1 | P        | 2018 |              0 |              5 |
| Team 1 | Tim Beckham        |      1 | 2B,SS    | 2018 |              0 |              4 |
| Team 1 | Ryon Healy         |      1 | 1B,3B    | 2018 |              0 |              3 |
| Team 1 | Aaron Altherr      |      1 | OF       | 2018 |              0 |              2 |
| Team 1 | Trevor Story       |      1 | SS       | 2018 |              0 |              1 |
| Team 1 | Marcus Semien      |      1 | SS       | 2018 |              0 |              0 |
+--------+--------------------+--------+----------+------+----------------+----------------+

Почему он дает мне нули, когда он достигает 10?

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT team, name, salary, year,
  IFNULL(
    SUM(salary) 
    OVER(PARTITION BY team, year ORDER BY salary, name ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
  , 0) AS running_salary
FROM `project.dataset.table`
ORDER BY team, year DESC, salary DESC, name DESC  

, если применить к вашим образцам данных - результат

Row team    name                salary      year    running_salary   
1   Team 1  Corey Kluber        47          2018    213  
2   Team 1  Manny Machado       46          2018    167  
3   Team 1  Rhys Hoskins        28          2018    139  
4   Team 1  Jose Quintana       27          2018    112  
5   Team 1  Buster Posey        27          2018    85   
6   Team 1  Edwin Encarnacion   22          2018    63   
7   Team 1  Khris Davis         16          2018    47   
8   Team 1  Marcus Stroman      14          2018    33   
9   Team 1  Ian Kinsler         7           2018    26   
10  Team 1  Felipe Vazquez      6           2018    20   
11  Team 1  Jeff Samardzija     4           2018    16   
12  Team 1  Michael Wacha       2           2018    14   
13  Team 1  Ender Inciarte      2           2018    12   
14  Team 1  Andrelton Simmons   2           2018    10   
15  Team 1  Trevor Story        1           2018    9    
16  Team 1  Tim Beckham         1           2018    8    
17  Team 1  Ryon Healy          1           2018    7    
18  Team 1  Mike Foltynewicz    1           2018    6    
19  Team 1  Matt Moore          1           2018    5    
20  Team 1  Marcus Semien       1           2018    4    
21  Team 1  Joe Musgrove        1           2018    3    
22  Team 1  Cam Bedrosian       1           2018    2    
23  Team 1  Adam Wainwright     1           2018    1    
24  Team 1  Aaron Altherr       1           2018    0    
0 голосов
/ 14 марта 2019

Вы можете использовать совокупную сумму, чтобы получить общую сумму:

select t.*,
       sum(salary) over (partition by team, year order by salary desc, name) as running_salary
from t;

Если бюджет фиксированный, вы можете просто использовать вычитание:

select t.*,
       260 - sum(salary) over (partition by team, year order by salary desc, name) as rolling_budget
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...