ソースコード
-- 「年月が最も古いレコードの年月」から「年月が最も新しいレコードの年月」の一覧を作成
WITH TMP_MONTH AS (
    SELECT
        MIN(MONTHLY) AS START_DATE
        , MAX(MONTHLY) AS END_DATE
    FROM
        MRR_DATA
    UNION ALL
    SELECT
        DATE(START_DATE, '+1 months')
        , END_DATE
    FROM
        TMP_MONTH
    WHERE
        START_DATE <= END_DATE
)
, MONTHS_TO_NEXT_MONTH AS (
    SELECT
        START_DATE AS YM
    FROM
        TMP_MONTH
)
-- 各月の「前月のNEW_MRR + 前月のEXPANSION_MRR - 前月のDOWNGRADE_MRR - 前月のCHURN_MRR」を計算
-- 起算初日はデータが存在しないため、必ずLAG_CALCはnull。
-- MONTHS_TO_NEXT_MONTHを元テーブルにしているため、MRR_DATAでデータがない月もLAG_CALCはnull。
, LAG_CALC AS (
    SELECT
        MONTH.YM
        , LAG(NEW_MRR, 1) OVER()
            + LAG(EXPANSION_MRR, 1) OVER()
            - LAG(DOWNGRADE_MRR, 1) OVER()
            - LAG(CHURN_MRR, 1) OVER()
            AS LAG_CALC
    FROM
        MONTHS_TO_NEXT_MONTH AS MONTH
    OUTER LEFT JOIN
        MRR_DATA ON MONTH.YM = MRR_DATA.MONTHLY
)

SELECT
    YM
    -- null(データなし)の場合は0とする
    , CASE WHEN LAG_CALC IS NULL
        THEN 
            0
        ELSE
            SUM(LAG_CALC) OVER(
                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
            )
        END
        AS MRR
FROM
    LAG_CALC
;
提出情報
提出日時2024/01/29 14:29:27
コンテスト第5回 SQLコンテスト
問題MRRの集計
受験者maori
状態 (詳細)AC
(Accepted: 正答)
メモリ使用量84 MB
メッセージ
テストケース(通過数/総数)
3/3
状態
メモリ使用量
データパターン1
AC
84 MB
データパターン2
AC
84 MB
データパターン3
AC
84 MB