Postgresql сопоставляет покупки с самыми последними записями устройства в loggedin

StackOverflow https://stackoverflow.com//questions/22023322

Вопрос

В моем приложении я храню логины с 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;

http://sqlfiddle.com /#!15/36185/9/0

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;
.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top