1

在我的应用程序中,我在user_id,device_id(ifa)和login表中存储了名为sessios_logs的登录日期。而且我在购买时使用user_id,金额和购买日期进行购物。Postgresql将购买与最近登录的设备进行了匹配

下面是这两个表的示例输出,我尝试为每次购买匹配来自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中的最大日期并且登录日期早于购买日期的情况下为每一行迭代。

谢谢。

+0

当您说“最接近”时,我想您的意思是最接近的给定登录日期<购买日期。 –

回答

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 
+0

非常感谢@罗瓦利! – CanCeylan

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

您可以使用窗口功能,但遗憾的是他们不能在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