postgresql的一个简单的sql

首先是有两个表,一个是用户信息表,一个是用户登录日志表,用户信息表中有一个字段upgrade_time,是一个同步数据时间,每天如果用户登录,会将当前时间与upgrade_time时间去做比较,如果时间差在一天以内,那么不做同步,超过一天的话调用接口同步会员数据,并将upgrade_time更新成同步数据的时间。然后是用户登录日志表,这个表很简单,用户登录一次,就会插入一条数据,并记录当前登录的时间。

因此根据上述两个表产生了一个需求,查询出所有无法同步最新数据的用户。

那么我们来分析这个需求,很简单无法同步数据就意味着,用户表中的upgrade_time比用户登录日志表中的当前用户的最近登录时间,至少小了一天以上,因为我们是一天同步一次嘛!所以只要找出这批,最近登录时间大于upgrade_time超过1天以上的用户就可以满足需求了。

这是t_mem_member_eclub用户信息表
这里写图片描述

这是t_store_member_login_log用户登录日志表
这里写图片描述

那么这个sql怎么写?首先我们要拿到每个用户的最近的登录时间。

SELECT
    MAX (login_time) login_time,member_id
FROM
    t_store_member_login_log
GROUP BY
    member_id

OK,然后是将这个用户最近的登录时间表与用户信息表关联起来。

SELECT
    eclub.member_id,
  eclub.upgrade_time,
  log.login_time
FROM
    t_mem_member_eclub eclub
LEFT JOIN 
    (
        SELECT
            MAX (login_time) login_time,member_id
        FROM
            t_store_member_login_log
        GROUP BY
            member_id
    ) log ON eclub.member_id = log.member_id

关联起来之后,最后一步就是比较upgrade_time和login_time了

SELECT
    eclub.member_id,
  eclub.upgrade_time,
  log.login_time
FROM
    t_mem_member_eclub eclub
LEFT JOIN 
    (
        SELECT
            MAX (login_time) login_time,member_id
        FROM
            t_store_member_login_log
        GROUP BY
            member_id
    ) log ON eclub.member_id = log.member_id
WHERE eclub.upgrade_time::timestamp + '1 day' < log.login_time;

至此,我们需要的结果已经查询出来了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生(FS)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值