PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Задайте обща стойност на месеца на всеки ден от месеца

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)

Имате нужда от естествено самосъединяване. Условията за присъединяване са:

  1. Първата маса без None записи (s1.country <> 'None' )
  2. Само за втора маса None записи (s2.country = 'None' )
  3. Дата:Вземете предвид само годината и месеца, игнорирайте дните. Това може да се постигне чрез нормализиране на датите на двете таблици към първото число на месеца с помощта на date_trunc() . Така, напр. '2020-02-15' води до '2020-02-01' и '2020-02-29' води до '2020-02-01' също, което работи добре като условие за сравнение и свързване.

Алтернативно :

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'

Можете да използвате SUM() прозоречна функция над групата от date_trunc() както е описано по-горе. След това трябва да филтрирате None записва след това



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да напиша Django заявка с подзаявка като част от клаузата WHERE?

  2. Как си взаимодействат прозоречните функции и групата по клауза?

  3. MySQL/Postgres заявка за данни с интервал от 5 минути

  4. wal_keep_segments защо минимум, а не максимум?

  5. Как да предоставим на Npgsql персонализиран тип данни като параметър?