Technique
Recherche à date d'effet
Trouver le taux, le prix ou la version valable à la date de chaque fait, dans une table qui stocke des changements.
Transformez les changements en périodes avec LEAD(valid_from) OVER (PARTITION BY clé ORDER BY valid_from) AS valid_to, puis joignez sur la clé et date_du_fait >= valid_from AND (valid_to IS NULL OR date_du_fait < valid_to).
Joindre sur la seule clé multiplie les faits par le nombre de versions. Utilisez un LEFT JOIN, et testez qu'aucun
fait ne reste sans taux.
WITH rates(valid_from, rate) AS (VALUES (DATE '2025-01-01', 0.20), (DATE '2025-07-01', 0.21)),
periods AS (
SELECT valid_from, LEAD(valid_from) OVER (ORDER BY valid_from) AS valid_to, rate FROM rates
),
sales(sold_on, amount) AS (VALUES
(DATE '2025-03-10', 120.00), (DATE '2025-07-01', 121.00), (DATE '2025-09-15', 60.50))
SELECT s.sold_on, s.amount, p.rate
FROM sales s
JOIN periods p ON s.sold_on >= p.valid_from
AND (p.valid_to IS NULL OR s.sold_on < p.valid_to)
ORDER BY s.sold_on;
| sold_on | amount | rate |
|---|---|---|
| 2025-03-10 | 120.00 | 0.20 |
| 2025-07-01 | 121.00 | 0.21 |
| 2025-09-15 | 60.50 | 0.21 |