SQL登录次数

:user_login_detail
字段:user_id login_ts
:order_info
字段:order_id user_id create_date total_amount

需求:从用户登录明细表 user_login_detail 和订单信息表 order_info 中查询每个用户的注册日期(首次登录日期)

总登录次数,2021登录次数 、订单数,订单金额
期望结果:
user_id register_date total_login_count login_count_2021 order_count_2021 order_amount_2021

 1 -- 方法一
 2 select 
 3  l.user_id,l.register_date ,l.total_login_count,l.login_count_2021
 4  ,r.order_count_2021,r.order_amount_2021
 5 
 6  from (
 7     select user_id,substr(login_ts,1,10) register_date ,total_login_count,login_count_2021  from (
 8         select user_id,login_ts,row_number()  over(partition by user_id order by login_ts) lgr
 9         ,count(user_id) over(partition by user_id) total_login_count
10         ,count(case when year(login_ts) = '2021' then user_id else null end) over(partition by user_id) login_count_2021
11         from user_login_detail 
12     ) a where lgr = 1
13 
14 ) l  left join (
15     select user_id,count(order_id) order_count_2021,sum(total_amount) order_amount_2021 from order_info
16     where create_date between '2021-01-01' and '2021-12-31' group by user_id
17 ) r on r.user_id = r.user_id
18 ;
19 
20 
21 
22 -- 方法二
23 
24 
25 
26 select 
27   
28   one.user_id,two.register_date
29      ,two.total_login_count
30      ,two.login_count_2021
31      ,one.order_count_2021
32      ,one.order_amount_2021
33   
34   from (
35 
36     select user_id,count(order_id) order_count_2021,sum(total_amount) order_amount_2021 from order_info
37     where create_date between '2021-01-01' and '2021-12-31' group by user_id
38 ) one left join (
39 
40     select 
41       distinct user_id
42      ,register_date
43      ,total_login_count
44      ,count(*) over(partition by user_id) login_count_2021
45     
46      from (
47         select 
48          user_id
49          ,login_date
50          ,count(*) over(partition by user_id) total_login_count
51          -- 注意这里 first_value 的用法
52          ,first_value(login_date) over(partition by user_id order by login_date) register_date
53          
54          from (
55             select  user_id,substr(login_ts,1,10) login_date from user_login_detail
56         ) a 
57     ) b where year(b.login_date) = '2021'
58 ) two on one.user_id = two.user_id

 

posted on 2025-06-23 11:38  北京的小乔  阅读(8)  评论(0)    收藏  举报