Предположим, у меня есть эта схема (проверена на postgresql), где отношение «Scorelines» содержит результаты спортивных матчей. (Зарезки боковых стволов является TIMESTAMP, но заменяется INT для удобства чтения)SQL moving aggregate SUM без частичных результатов
SQLFiddle здесь: http://sqlfiddle.com/#!12/52475/3
CREATE TABLE Scorelines (
team TEXT,
kickoff INT,
scored INT,
conceded INT
);
Теперь я хочу, чтобы произвести еще один столбец «three_matches_scored», который содержит сумму набранных очков за 3 предшествующих игра (определяемая стартом) той же команды. У меня есть следующее:
SELECT team, kickoff, scored, conceded, SUM(scored) OVER three_matches AS three_matches_scored
FROM Scorelines
WINDOW three_matches AS
(PARTITION BY team ORDER BY kickoff
ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING)
ORDER BY kickoff;
Это прекрасно работает до сих пор, за исключением того, что я получаю значения, начиная со второй игры. Пример:
| TEAM | KICKOFF | SCORED | CONCEDED | THREE_MATCHES_SCORED |
|------|---------|--------|----------|----------------------|
| A | 1 | 1 | 0 | (null) |
| B | 2 | 1 | 1 | (null) |
| A | 3 | 1 | 1 | 1 |
| A | 4 | 3 | 0 | 2 |
| B | 4 | 1 | 4 | 1 |
| A | 6 | 0 | 2 | 5 |
| B | 6 | 4 | 2 | 2 |
| B | 8 | 1 | 2 | 6 |
| B | 10 | 1 | 1 | 6 |
| A | 11 | 2 | 1 | 4 |
Я хочу, чтобы колонка «three_matches_scored» быть (нуль) в течение первых 3-х игр, потому что нет 3 результатов не подводить итоги. Как я могу это достичь?
Я бы предпочел простые понятные решения, производительность не является критичной для данного конкретного случая.
Моя единственная идея прямо сейчас состоит в том, чтобы определить сохраненную функцию SUM3, которая приводит к (null) с менее чем 3 значениями для добавления. Но я никогда не определял функцию в SQL и не могу понять ее.
Спасибо, работает. – Secoe