sql >> Base de Datos >  >> RDS >> PostgreSQL

Asigne el valor total del mes a cada día del mes

demostraciones: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)

Necesitas una autounión natural. Las condiciones para unirse son:

  1. Primera mesa sin None registros (s1.country <> 'None' )
  2. Segunda mesa solo None registros (s2.country = 'None' )
  3. Fecha:solo considere la parte del año y el mes, ignore los días. Esto se puede lograr normalizando las fechas de ambas tablas al primer día del mes usando date_trunc() . Entonces, p. '2020-02-15' da como resultado '2020-02-01' y '2020-02-29' da como resultado '2020-02-01' también, que funciona bien como condición de comparación y unión.

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'

Puedes usar el SUM() función de ventana sobre el grupo de date_trunc() como se describió anteriormente. Entonces necesitas filtrar el None registros después