Sobes.tech
Middle

Jak zaimplementować zapytanie z maksymalną datą kursu dla każdej transakcji, uwzględniając weekendy i święta?

sobes.tech AI

Odpowiedź od AI

Aby zaimplementować zapytanie, które dla każdej transakcji wybiera kurs z maksymalną datą, uwzględniając weekendy i święta, potrzebujesz:

  1. Tabeli z kursami walut, gdzie wskazane są daty, kiedy kurs był aktualny.
  2. Tabeli z kalendarzem, gdzie zaznaczone są weekendy i święta.

Pomysł zapytania — dla każdej transakcji — znaleźć maksymalną datę kursu, która nie przekracza daty transakcji i jest dniem roboczym.

Przykład w SQL (PostgreSQL):

WITH working_days AS (
  SELECT date
  FROM calendar
  WHERE is_holiday = FALSE AND is_weekend = FALSE
),
max_course_dates AS (
  SELECT t.transaction_id, MAX(c.date) AS max_course_date
  FROM transactions t
  JOIN courses c ON c.date <= t.transaction_date
  JOIN working_days wd ON c.date = wd.date
  GROUP BY t.transaction_id
)
SELECT t.*, c.rate
FROM transactions t
JOIN max_course_dates mcd ON t.transaction_id = mcd.transaction_id
JOIN courses c ON c.date = mcd.max_course_date
  AND c.currency = t.currency
;

W ten sposób dla każdej transakcji wybierany jest kurs z maksymalną datą, która nie jest późniejsza od daty transakcji i jest dniem roboczym (nie weekend, nie święto).