PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Atribuir o valor total do mês a cada dia do mês


demos:db<>fiddle
SELECT
    s1.sales_date,
    s1.country,
    s1.sales_volume,
    s2.fix_costs
FROM sales s1
JOIN sales s2 ON s1.country <> 'None' AND s2.country = 'None' 
    AND date_trunc('month', s1.sales_date) = date_trunc('month', s2.sales_date)

Você precisa de uma auto-junção natural. As condições de associação são:
  1. Primeira tabela sem None registros (s1.country <> 'None' )
  2. Segunda tabela somente None registros (s2.country = 'None' )
  3. Data:considere apenas a parte do ano e do mês, ignore os dias. Isso pode ser feito normalizando as datas de ambas as tabelas para o primeiro dia do mês usando date_trunc() . Assim, por exemplo '2020-02-15' resulta em '2020-02-01' e '2020-02-29' resulta em '2020-02-01' também, que funciona bem como condição de comparação e junção.

Alternativamente :
SELECT
    *
FROM (
    SELECT
        sales_date,
        country,
        sales_volume,
        SUM(fix_costs) OVER (PARTITION BY date_trunc('month', sales_date)) as fix_costs
    FROM sales 
) s
WHERE country <> 'None'

Você pode usar o SUM() função de janela sobre o grupo de date_trunc() como descrito acima. Então você precisa filtrar o None registros depois