Выберите последнюю строку со значением, меньшим, чем значение другой таблицы

# #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;
 

Смотрите демонстрацию.