PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tambahkan bulan yang hilang dalam hasil dengan nilai dari bulan sebelumnya

Anda dapat mencapai ini dengan cte rekursif seperti ini:

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;

Perhatikan bahwa meskipun ctetest itu sendiri bukan recursive , hanya digunakan untuk mendapatkan data pengujian, jika ada cte di antara beberapa ctes yang recursive , Anda harus memiliki kata kunci rekursif setelah 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. ValueError u mendukung format karakter 'd' dengan psycopg2

  2. Batalkan kueri saat ini/aktif di Ruby on Rails

  3. Tambahkan Tahun ke Tanggal di PostgreSQL

  4. Memilih catatan antara dua cap waktu

  5. Bagaimana saya bisa memasukkan stempel waktu dengan zona waktu di postgresql dengan pernyataan yang disiapkan?