加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL:查找到目前为止连续几天的数量

发布时间:2020-12-13 16:01:14 所属栏目:百科 来源:网络整理
导读:给定一组带有时间戳字段的记录(代表我的应用程序中的签名),那么确定连续签入的当前条纹的好方法是什么? 换句话说,通过签入时间降序排序的签到,在用户错过一天之前有多少条记录? 目前我正在使用这种技术: SELECT distinct(uca.created_at::date) as create
给定一组带有时间戳字段的记录(代表我的应用程序中的签名),那么确定连续签入的当前条纹的好方法是什么?

换句话说,通过签入时间降序排序的签到,在用户错过一天之前有多少条记录?

目前我正在使用这种技术:

SELECT distinct(uca.created_at::date) as created_at
    FROM user_challenge_activities as uca INNER JOIN user_challenges as uc
    ON user_challenge_id = uc.ID WHERE uc.user_id = #{user.id}
    order by (uca.created_at::date) DESC;

…我将签到时间戳转换为日期(最终以2012-03-20结束),然后在代码中,浏览记录并递增计数器,直到记录与下一记录之间的日期大于1天.

然而,这种方法对我来说似乎很笨拙,而且看起来像Postgres会擅长的那种东西.

那么实际上有更好的方法来实现这一目标吗?

解决方法

with t as (
    SELECT distinct(uca.created_at::date) as created_at
    FROM user_challenge_activities as uca 
    INNER JOIN user_challenges as uc ON user_challenge_id = uc.ID 
    WHERE uc.user_id = #{user.id}
    )
select count(*)
from t
where t.create_at > (
    select d.d
    from generate_series('2010-01-01'::date,CURRENT_DATE,'1 day') d(d)
    left outer join t on t.created_at = d.d::date
    where t.created_at is null
    order by d.d desc
    limit 1
)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读