# #sql #google-bigquery
Вопрос:
У меня есть два стола
Операции
tx_id | стоимость |
---|---|
150 | 10000 |
100 | 7000 |
50 | 5000 |
Премиум
с_тх_ид | Оценить |
---|---|
120 | 10 |
45 | 5 |
Я хотел бы получить премиальную ставку для каждого элемента в таблице Транзакций. Результат должен выглядеть так:
tx_id | стоимость | Оценить |
---|---|---|
150 | 10000 | 10 |
100 | 7000 | 5 |
50 | 5000 | 5 |
Таким образом, ставка для каждой из Транзакций будет ближайшим (предыдущим) значением since_tx_id из предыдущей таблицы.
Я пробовал использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ с использованием ROW_NUMBER (), но это не сработало, и я также пытался использовать оператор MAX, оба без хороших результатов.
Ответ №1:
Я бы предложил использовать lead()
, а затем join
:
select t.*, p.rate
from transactions t join
(select p.*,
lead(since_tx_id) over (order by since_tx_id) as next_ since_tx_id
from premium p
) p
on t.tx_id >= since_tx_id and
(t.tx_id < next_since_tx_id or next_since_tx_id is null);
Ответ №2:
Используйте LEFT
функцию соединения таблиц и FIRST_VALUE()
окон:
SELECT DISTINCT t.*,
FIRST_VALUE(p.rate) OVER (PARTITION BY t.tx_id ORDER BY p.since_tx_id DESC) rate
FROM Transactions t LEFT JOIN Premium p
ON p.since_tx_id <= t.tx_id;
Смотрите демонстрацию.