Postgresql сопоставляет покупки с самыми последними записями устройства в loggedin
-
21-12-2019 - |
Вопрос
В моем приложении я храню логины с user_id, device_id(ifa) и датой входа в систему в таблице под названием sessios_logs.И я храню покупки с user_id, суммой и датой покупки в таблице под названием purchases.
Ниже приведены примеры выходных данных этих двух таблиц, в которых я пытаюсь сопоставить соответствующие значения ifa из session_logs для каждой покупки.
журналы сессий
uid ifa date
7560168721 CCC 1
7560168721 AAA 3
7560168721 BBB 5
7560168721 AAA 8
7560168721 AAA 10
покупки
uid amount date <ifa>?
7560168721 $1 2 CCC
7560168721 $9 4 AAA
7560168721 $5 7 BBB
7560168721 $4 11 AAA
Итак, как я могу найти ближайшую дату входа в систему и значение ifa для каждой покупки?
Я не знаю, как выполнить итерацию для каждой строки, проверяя максимальную дату в session_logs и имея дату входа в систему раньше даты покупки.
Спасибо.
Решение
Вы можете использовать один из функций окна, чтобы соответствовать дату покупки на ближайшую дату сеанса.
SELECT uid, amount, date, ifa
FROM
(SELECT
t1.uid,
t2.amount,
t2.date AS date,
ROW_NUMBER() OVER (PARTITION BY t1.uid, t2.date) AS rn,
t1.ifa
FROM
session_logs t1
JOIN purchases t2 ON
t1.uid = t2.uid AND
t1.date <= t2.date) x1
WHERE x1.rn = 1
. Другие советы
Вы можете использовать оконные функции, однако, к сожалению, они не разрешены в WHERE
часть, следовательно, вокруг нее есть запрос-оболочка:
select
uid,
amount,
date,
ifa
from
(
select
l.uid,
amount,
p.date as date,
max(l.date) over (partition by l.uid, p.date) as max_date,
l.ifa
from
session_logs l
join purchases p on
l.uid = p.uid and
l.date <= p.date
-- where l_date = max(l.date) over (partition by l.uid, p.date)
) t
where l_date=max_date;
select
uid,
amount,
date,
(
select ifa
from session_logs
where
uid = purchases.uid and
date < purchases.date
order by date desc
limit 1
)
from purchases;
.