再帰的な共通表式を使用して連続データを欠落します
9001 ワード
文脈
私は日付によって他の通貨で通貨の価値を含むテーブルを持っています、しかし、働く日付だけ.
私は、ソーステーブルの始まりからすべての日付のためにデータを必要とします.
サンプルデータ:
ご覧の通り、日付は連続ではありません.
最初のトライ
WITH srct(fecha) AS (
SELECT MIN(fecha) fecha FROM BCRD_TC_OTRAS_MON
UNION ALL
SELECT fecha + 1 fecha FROM srct WHERE fecha + 1 <= (SELECT MAX(fecha) fecha FROM BCRD_TC_OTRAS_MON)
)
SELECT a.fecha,
NVL(dolar_can, LAG(dolar_can, 1) OVER(ORDER BY a.fecha)) dolar_can,
NVL(franco_sui, LAG(franco_sui, 1) OVER(ORDER BY a.fecha)) franco_sui,
NVL(euro, LAG(euro, 1) OVER(ORDER BY a.fecha)) euro,
NVL(dolar_usd, LAG(dolar_usd, 1) OVER(ORDER BY a.fecha)) dolar_usd
FROM
srct a
LEFT JOIN
BCRD_TC_OTRAS_MON b ON b.fecha = a.fecha
ORDER BY 1
結果このアプローチは前の日付からデータを受け取りますが、連続した欠落データの1日以上は動作しません.
COALESCE
と複数のLAG
関数を使用している場合には動作しますが、最終的にはクエリは上品に見えません.次のトライ
WITH srct(fecha, dolar_can, franco_sui, euro, dolar_usd) AS (
SELECT fecha, dolar_can, franco_sui, euro, dolar_usd FROM BCRD_TC_OTRAS_MON WHERE fecha = (SELECT MIN(fecha) fecha FROM BCRD_TC_OTRAS_MON)
UNION ALL
SELECT a.fecha + 1 fecha,
NVL(b.dolar_can, a.dolar_can), NVL(b.franco_sui, a.franco_sui),
NVL(b.euro, a.euro), NVL(b.dolar_usd, a.dolar_usd)
FROM srct a
LEFT JOIN
BCRD_TC_OTRAS_MON b ON a.fecha + 1 = b.fecha
WHERE a.fecha + 1 <= (SELECT MAX(fecha) fecha FROM BCRD_TC_OTRAS_MON)
)
SELECT fecha, dolar_can, franco_sui, euro, dolar_usd
FROM srct
ORDER BY 1
結果このアプローチを使用すると、すべての行方不明の日付の
BCRD_TC_OTRAS_MON
テーブルからSRCTと以前の利用可能な行データからすべての日付を取得します.私はそれが助けることを望む.
読書ありがとう.
Reference
この問題について(再帰的な共通表式を使用して連続データを欠落します), 我々は、より多くの情報をここで見つけました https://dev.to/rolangom/using-recursive-common-table-expressions-and-filling-missing-data-oracle-sql-8ilテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol