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の後にrecursiveキーワードが必要です 。



    1. MySQLとejabberdによる効率的な外部名簿

    2. SQL行から列へ

    3. DDLの変更をある環境から次の環境に移行するにはどうすればよいですか?

    4. SQL Server(T-SQL)で現在のセッションの言語を取得する3つの方法