首页 > 试题广场 >

游戏平台新玩家消费与进阶行为分析

[编程题]游戏平台新玩家消费与进阶行为分析
  • 热度指数:115 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

背景

一家游戏公司希望分析其平台新玩家的用户粘性和消费潜力。他们需要识别出在特定月份注册,并在后续一个月内有消费行为的玩家,同时评估他们的游戏进度(等级)。此举旨在帮助运营团队更好地理解高价值新玩家的用户画像。

表结构和字段说明

表1:玩家信息表 (players)

  • player_id: (INT, 主键) 玩家的唯一标识。
  • username: (VARCHAR) 玩家的昵称。
  • level: (INT) 玩家的当前等级。
  • creation_date: (DATE) 玩家账户的创建日期。

表2:游戏内交易表 (transactions)

  • transaction_id: (INT, 主键) 交易的唯一标识。
  • player_id: (INT) 进行交易的玩家ID。
  • item_name: (VARCHAR) 购买的道具名称。
  • cost: (DECIMAL) 道具的价格。
  • purchase_time: (DATETIME) 购买行为发生的精确时间。

3. 问题

任务要求

请查询所有在 2025年3月 创建账户,并且在 2025年4月 期间(2025-04-01 至 2025-04-30)有过至少一次消费记录的玩家。对于这些玩家,请计算他们在4月份的总消费金额,并根据他们的当前等级进行分类:等级大于等于30级的为“高阶玩家”,否则为“新秀玩家”。

查询结果要求

请返回以下字段:

  • 玩家ID (player_id)
  • 玩家昵称 (username)
  • 当前等级 (current_level)
  • 玩家分类 (player_category)
  • 4月总消费金额 (total_april_spending),结果四舍五入保留2位小数。

排序规则

查询结果请先按player_category降序排列(即 "高阶玩家" 在前),然后按total_april_spending降序排列,最后按player_id升序排列。

示例1

输入

-- 创建玩家信息表
CREATE TABLE players (
    player_id INT,
    username VARCHAR(50),
    level INT,
    creation_date DATE
);

-- 创建游戏内交易表
CREATE TABLE transactions (
    transaction_id INT,
    player_id INT,
    item_name VARCHAR(50),
    cost DECIMAL(10, 2),
    purchase_time DATETIME
);

-- 插入示例数据
-- 玩家信息
INSERT INTO players (player_id, username, level, creation_date) VALUES
(101, 'ShadowBlade', 45, '2025-03-05'), -- 目标玩家
(102, 'RookieMist', 15, '2025-03-10'), -- 目标玩家
(103, 'AncientOne', 80, '2025-02-15'), -- 注册月份不对
(104, 'Ghost', 25, '2025-03-20');      -- 目标玩家,但在4月无消费

-- 游戏内交易
INSERT INTO transactions (transaction_id, player_id, item_name, cost, purchase_time) VALUES
(1, 101, 'Excalibur Sword', 99.99, '2025-04-02 10:00:00'),
(2, 101, 'Health Potion', 4.50, '2025-04-10 11:30:00'),
(3, 102, 'Starter Pack', 9.99, '2025-04-05 14:00:00'),
(4, 103, 'Phoenix Feather', 199.99, '2025-04-08 16:00:00'), -- 玩家不符合注册时间
(5, 101, 'Magic Shield', 45.00, '2025-04-15 18:00:00'),
(6, 102, 'Health Potion', 4.50, '2025-04-20 09:00:00'),
(7, 104, 'Mount', 29.99, '2025-03-28 17:00:00'); -- 消费月份不对

输出

player_id|username|current_level|player_category|total_april_spending
101|ShadowBlade|45|高阶玩家|149.49
102|RookieMist|15|新秀玩家|14.49

说明

示例数据表

players

player_idusernamelevelcreation_date
101ShadowBlade452025-03-05
102RookieMist152025-03-10
103AncientOne802025-02-15
104Ghost252025-03-20

transactions

transaction_idplayer_iditem_namecostpurchase_time
1101Excalibur Sword99.992025-04-02 10:00:00
2101Health Potion4.502025-04-10 11:30:00
3102Starter Pack9.992025-04-05 14:00:00
4103Phoenix Feather199.992025-04-08 16:00:00
5101Magic Shield45.002025-04-15 18:00:00
6102Health Potion4.502025-04-20 09:00:00
7104Mount29.992025-03-28 17:00:00

示例数据查询结果表

player_idusernamecurrent_levelplayer_categorytotal_april_spending
101ShadowBlade45高阶玩家149.49
102RookieMist15新秀玩家14.49
-- 有purchase_time购买行为,就【至少一次消费记录】,不用专门过滤次数了
-- 如果至少2次, 增加一个having(t.transaction_id) >=2 即可
select
    p.player_id
    ,p.username
    ,p.level as current_level
    ,case when p.level >= 30 then '高阶玩家' else '新秀玩家' end as player_category
    ,round(sum(t.cost), 2) as total_april_spending
from 
    players as p 
    inner join transactions as t on p.player_id = t.player_id
where
    p.creation_date >= '2025-03-01' and p.creation_date <'2025-04-01'
    and t.purchase_time >= '2025-04-01' and t.purchase_time < '2025-05-01'
group by 
    p.player_id, p.username, p.level

order by 
    case when player_category = '高阶玩家' then 0 else 1 end asc ,
    total_april_spending desc ,
    p.player_id asc ;

发表于 2026-02-03 22:06:20 回复(0)
为啥我这个不行啊,来个懂哥给老弟指点一下呗
select player_id,username,level current_level,
if(level>=30,'高级玩家','新秀玩家') player_category,
round(sum(cost),2) total_april_spending
from (
    select p.player_id,username,level,creation_date,transaction_id,item_name,cost,purchase_time
    from players p join transactions t on p.player_id = t.player_id 
    and creation_date like '2025-03%' and purchase_time like '2025-04%'
) t1 
group by player_id,username,level
order by player_category desc,total_april_spending desc,player_id

发表于 2026-02-03 17:07:01 回复(1)
with people as(
    select p.player_id,
           sum(case when date(purchase_time) between '2025-04-01' and ' 2025-04-30' then 1 else 0 end) as purchase_cnt
    from players p
    inner join transactions t on p.player_id = t.player_id
    where month(creation_date) = '3'
    group by p.player_id
    having purchase_cnt>=1
)

select distinct p.player_id,username,level as current_level,
       case when level>=30 then '高阶玩家' else '新秀玩家' end as player_category,
       sum(cost) over(partition by p.player_id) as total_april_spending
from players p
inner join transactions t2 on p.player_id = t2.player_id
where p.player_id in (select player_id from people) and (date(purchase_time) between '2025-04-01' and ' 2025-04-30')
order by field(player_category,'高阶玩家','新秀玩家'),total_april_spending desc ,player_id asc

发表于 2026-02-03 16:05:42 回复(0)
select player_id,username,current_level,
    if(current_level >=30,'高阶玩家','新秀玩家') player_category,
    total_april_spending
from (
    select 
        player_id,username,level current_level,
        sum(cost) total_april_spending
    from transactions
    join players using(player_id)
    where creation_date like '2025-03%'
        and purchase_time like '2025-04%'
    group by player_id,username,current_level
)a
order by player_category desc,total_april_spending desc,player_id

发表于 2026-02-01 14:04:41 回复(0)