Dodanie kolumny z drugiej tabeli dla pierwszej znalezionej wartości

0

Witam,
Podpowiedzcie proszę w jaki sposób mogę uzyskać następujący rezultat.

Mam dwie tabele
kurs_wymiany
id_kursu, waluta, mnoznik, data

faktury_zakup
id_faktury, waluta, data_faktury

I teraz tak, potrzebuję pobrać id_faktury, data_faktury z tabeli
faktury_zakup i dołożyć do tego kolumnę data z tabeli kurs_wymiany
musi to być data równa lub pierwsza kolejna w porównaniu z data_faktury

Join po walucie odpada ponieważ w tabeli faktury_zakup zawsze mamy "USD" natomiast ja potrzebuję pobrać z kurs_wymiany dane dla "USD" oraz "EUR"
Poniżej screen może pomoże wyjaśnić co mam na myśli.

screenshot-20200116123251.png

0

No to połącz po dacie, bo innej opcji nie ma.

0

Problem w tym, że data nie zawsze będzie się pokrywać i w takim wypadku trzeba by było wybrać najbliższą datę do daty z tabeli faktury_zakup
Inne rozwiązanie, które mi przyszło do głowy (chociaż lepiej by tego nie robić) to zrobienie procedury, która sprawdzi czy są wpisy dla danego dnia jeśli nie to zrobi INSERT do tabeli ** kurs_wymiany** z danymi za dzień wcześniejszy i w tym wypadku zawsze będzie dostępna data żeby zrobić JOIN

0

Jakiego używasz DBMS? ROW_NUMBER() OVER ... z grupowaniem i sortowaniem + odfiltrowanie po row_number = 1 powinno załatwić sprawę, choć pewnie jest lepszy sposób.

W Postgres 9.6 możesz uzyskać zamierzony efekt takim zapytaniem:

WITH merged_result AS ( SELECT
  transactions.id AS id,
  transactions.date_at AS transaction_date_at,
  exchange_rates.currency AS currency,
  exchange_rates.date_at AS exchange_rate_date,
  ROW_NUMBER() OVER (PARTITION BY transactions.id ORDER BY exchange_rates.date_at DESC) AS row_number
  FROM transactions INNER JOIN exchange_rates ON transactions.date_at >= exchange_rates.date_at
)                       
SELECT id, transaction_date_at, currency, exchange_rate_date FROM merged_result WHERE row_number = 1;
0
superdurszlak napisał(a):

Jakiego używasz DBMS? ROW_NUMBER() OVER ... z grupowaniem i sortowaniem + odfiltrowanie po row_number = 1 powinno załatwić sprawę, choć pewnie jest lepszy sposób.

W Postgres 9.6 możesz uzyskać zamierzony efekt takim zapytaniem:

WITH merged_result AS ( SELECT
  transactions.id AS id,
  transactions.date_at AS transaction_date_at,
  exchange_rates.currency AS currency,
  exchange_rates.date_at AS exchange_rate_date,
  ROW_NUMBER() OVER (PARTITION BY transactions.id ORDER BY exchange_rates.date_at DESC) AS row_number
  FROM transactions INNER JOIN exchange_rates ON transactions.date_at >= exchange_rates.date_at
)                       
SELECT id, transaction_date_at, currency, exchange_rate_date FROM merged_result WHERE row_number = 1;

Microsoft SQL z
Microsoft SQL Server Managment Studio.
Hmmm... poczytam o tym co piszesz, może uda się osiągnąć efekt. Dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1