PostgreSQL bit运算CASE - 最近7天消费金额大于N的用户bits

本文介绍了一种使用PostgreSQL数据库来分析用户消费行为的方法。通过创建包含日期、消费金额及用户BITMAP的数据表,并利用随机生成BIT的函数填充测试数据,最终实现了查询最近7天内消费金额超过100的用户的案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标签

PostgreSQL , bit , case when


背景

有一个这样的数据结构

日期, 消费金额,userbitmaps。表示这一天这些设置为1的BIT位对应对用户消费了这么多金额。

需求,最近7天,消费大于多少的用户有哪些。

create table t_test (   
  dt date,      -- 日期  
  amount int,   -- 消费额度  
  users varbit  -- 用户BITMAP  
);   

生成随机BIT的函数

create or replace function gen_rand_bit() returns bit(64) as $$    
  select (sqrt(random())::numeric*9223372036854775807*2-9223372036854775807::numeric)::int8::bit(64);    
$$ language sql strict;    

插入100万测试数据

insert into t_test  
  select current_date-(random()*1000)::int, random()*100, gen_rand_bit() from generate_series(1,1000000);  

最近7天消费金额大于100的用户SQL如下:

select (concat(pos0,pos1,pos2,pos3))::varbit from  
(  
  select   
    case when sum(amount*get_bit(users, 0)) > 100 then 1 else 0 end as pos0,  
    case when sum(amount*get_bit(users, 1)) > 100 then 1 else 0 end as pos1,  
    case when sum(amount*get_bit(users, 2)) > 100 then 1 else 0 end as pos2,  
    case when sum(amount*get_bit(users, 3)) > 100 then 1 else 0 end as pos3  
    -- 你需要补齐所有的BIT位,本例只测4个  
  from t_test   
  where   
    dt between current_date-7 and current_date  
) t;  
  
  
 concat   
--------  
 1111  
(1 row)  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值