Estou tentando criar uma média trimestral para as pontuações dos jogadores, no entanto, o comportamento padrão do postgres date_trunc('quarter', source)
é que ele começa no primeiro trimestre com YYYY-01-01.
Existe alguma maneira possível ou solução alternativa que eu possa fazer para dizer que o primeiro mês do primeiro trimestre é, por exemplo, setembro? Então, em vez do tradicional: Q1: 1-3, Q2: 4-6, Q3: 7-9, Q4: 10-12
Eu quero ser capaz de especificar qual mês é o início do primeiro trimestre, então se eu disser setembro, deve ser: Q1: 9-11, Q2: 12-2, Q3: 3-5, Q4: 6-8
Aqui está como eu faço uma média de pontuação trimestral padrão com o trimestre padrão.
SELECT id,
name,
date_trunc('quarter', date) AS date,
AVG(rank) AS rank,
AVG(score) as score,
country,
device
FROM player_daily_score
GROUP BY id, name, 3, country, device
ORDER BY 3 desc;
Estou aberto a todas as sugestões para fazer este trabalho.
Se você realmente não precisar da data de início do trimestre, poderá fazer isso facilmente com uma expressão CASE:
Claro que você pode colocar isso em uma função armazenada para tornar suas consultas mais simples.
Na verdade, você não usa o número do trimestre, apenas os carimbos de data e hora. Portanto, tudo o que você precisa é de um offset , que você subtrai e adiciona de volta após truncar, que é
interval '2 month'
para o seu exemplo:db<>fique aqui
No entanto , sua consulta não faz sentido. Incluir a
id
coluna (supondo que seja o PK)GROUP BY
é uma operação de ruído, pois nada será agregado. Isso pode fazer sentido:Se
id
não for o PK, seu design de banco de dados pode lucrar com a normalização .