PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thêm vào kết quả tháng còn thiếu với các giá trị từ tháng trước

Bạn có thể đạt được điều này với một cte đệ quy như sau:

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;

Lưu ý rằng mặc dù bản thân ctetest không phải là recursive , chỉ được sử dụng để lấy dữ liệu thử nghiệm, nếu bất kỳ cte nào trong số nhiều byte là recursive , bạn phải có từ khóa đệ quy sau 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. Làm cách nào để chuyển đổi một khoảng thời gian thành một số giờ với postgres?

  2. Nhận tên của chủ sở hữu DB trong PostgreSql

  3. Chọn một tập hợp các cột động từ một bảng và lấy tổng cho mỗi cột

  4. Các bài kiểm tra PostgreSQL được nhúng cho Java JUnit

  5. Thêm một trong hai ràng buộc không null trong postgresql