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

Добавете липсващ месец в резултат със стойности от предходния месец

Можете да постигнете това с рекурсивен cte като този:

with RECURSIVE ctetest as (SELECT * FROM (values ('2020-12-31'::date,'Alex',35,100,'A+'),
            ('2021-01-31'::date,'Alex',35,110,'A'),
            ('2021-05-31'::date,'Alex',35,999,'A+'),
            ('2021-06-30'::date,'Jhon',20,175,'B-'),
            ('2021-09-30'::date,'Jhon',20,200,'B+')) v (mth, emp, age, salary, rating)), 
cte AS (
    SELECT MIN(mth) AS mth, emp, age, salary, rating
    FROM ctetest
    GROUP BY emp, age, salary, rating
    UNION 
    SELECT COALESCE(n.mth, (l.mth + interval '1 day' + interval '1 month' - interval '1 day')::date), COALESCE(n.emp, l.emp), 
    COALESCE(n.age, l.age), COALESCE(n.salary, l.salary), COALESCE(n.rating, l.rating)
    FROM cte l
    LEFT OUTER JOIN ctetest n ON n.mth = (l.mth + interval '1 day' + interval '1 month' - interval '1 day')::date 
                                AND n.emp = l.emp
    WHERE (l.mth + interval '1 day' + interval '1 month' - interval '1 day')::date <= (SELECT MAX(mth) FROM ctetest)
)
SELECT * FROM cte order by 2, 1;

Имайте предвид, че въпреки че ctetest не е сам по себе си recursive , като се използва само за получаване на тестовите данни, ако някой cte сред множество cte е recursive , трябва да имате рекурсивната ключова дума след with .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте списък с първи и последен ден от месеца за даден период

  2. Изберете Номер на ред в postgres

  3. ActiveRecord::AdapterNotSpecified конфигурацията на базата данни не посочва адаптер

  4. java.lang.NoSuchFieldError:NONE в хибернация с Spring 3, maven, JPA, c3p0

  5. Какъв е правилният начин за използване на модула node.js postgresql?