与最新设备登录的Postgresql匹配购买

时间:2014-02-25 18:42:37

标签: postgresql partitioning window-functions amazon-redshift

在我的应用程序中,我使用user_id,device_id(ifa)和登录日期在名为sessios_logs的表中存储登录。并且我将购买与user_id,金额和购买日期存储在称为购买的表中。

下面是这两个表的示例输出,我尝试在每次购买时匹配session_logs中相应的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中的最大日期并且登录日期早于购买日期时如何迭代每一行。

感谢。

3 个答案:

答案 0 :(得分:1)

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;

答案 1 :(得分: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

答案 2 :(得分:1)

您可以使用其中一个窗口功能将购买日期与最近的会话日期相匹配。

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