pqsql 怎么生成间隔类数据集合

在日常场景中,经常会有间隔类的统计场景,如充值区间、等级区间。当原始数据缺省时,往往需要程序再次补充。那么pqsql协议的数据库或者数仓有么有好的解决方案呢

前提知识点

集合返回函数:generate_series

此函数主要用来升级区间数据的,结果是返回区间集合。如:generate_series(start, stop)

select * from generate_series(2,50)

-- 返回结果
generate_series
-----------------
               2
               3
               ...
               49
               50
(49 rows)

可复用临时公共查询:cte

支持cte的查询可以服用查询结果,也就是带with关键字的子查询

with
tmp_query_name [(column1,...)] as (
业务query,如:
select 
    user_id
from
    user_map
where
    reg_date = 20241025
)[,tmp_query_name2 as (...)]
select
    count(1)
    count(tmp_query_name.user_id)
from
    tmp_query_name 
left join login_log on 
    tmp_query_name.user_id = login_log.user_id

在CTE范围内,后面定义的CTE可以引用前面定义的的表,实现复用。也可以实现sql规范中的以小集合牵动大集合(以小击大,四两千斤),手动定义最优查询路径

使用场景

generate_series(start, stop)

生成start到stop的步长1的集合

generate_series(start, stop,step)

生成start到stop的步长为step值的集合,注意step可以为负数

generate_series(start, stop,step interval)

生成start到stop的步长为step值的集合,注意step时间区间

select 
    *
from
generate_series('2025-10-01 00:00'::timestamp,
'2025-10-24 12:00'::timestamp,
'10 hours'
)

此时start和stop类型为TIMESTAMP或TIMESTAMP WITH TIME ZONE

每5分钟一次的登录统计

先用CTE生成时间间隔,防止缺省情况,然后常规操作即可

with
time_range(ts) as (
select 
    *
from
generate_series('2025-10-24 00:00'::timestamp,now(),'5 minutes')
)
select
    ts,
    count(1) as times,
    count(distinct user_id)
from
    time_range left join user_login_log ull 
    on ull.login_ts >= time_range.ts and ull.login_ts < time_range.ts + interval '5 minutes'
where login_date = 20251024
group by ts
order by ts

至此非缺省的时间间隔生成完毕 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Calvin_Huang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值