排行榜表中前一行total_of_won_and_looking_good值对比查询需求
实现用户排行榜的对比与验证方案
先把你的需求拆解成几个核心落地步骤,这样更容易理解和实现:
- 计算每个用户的
total_of_won_and_looking_good总和(统计pick status为1或2的次数,用户最多4次pick) - 按规则生成排行榜(总和降序,相同则按
points_player排序) - 对比每行与前一行的
total_of_won_and_looking_good值,同时验证每行的pick status是否高于前一行
下面以支持窗口函数的SQL(比如MySQL 8+、PostgreSQL、SQL Server)为例,给出具体实现方案:
第一步:用户核心指标汇总
先从原始的pick记录表中,汇总每个用户的关键数据:
WITH user_summary AS ( SELECT user_id, -- 统计pick status为1或2的次数,作为总和 SUM(CASE WHEN pick_status IN (1, 2) THEN 1 ELSE 0 END) AS total_of_won_and_looking_good, points_player, -- 获取用户的最高pick status(用来验证"每行pick status高于前一行"的要求) MAX(pick_status) AS highest_pick_status FROM user_picks GROUP BY user_id, points_player )
第二步:生成排行榜并添加行对比数据
基于汇总表生成排序后的排行榜,用LAG()窗口函数获取前一行的对比数据,同时添加验证字段:
SELECT user_id, total_of_won_and_looking_good, points_player, highest_pick_status, -- 获取前一行的总和值 LAG(total_of_won_and_looking_good) OVER (ORDER BY total_of_won_and_looking_good DESC, points_player DESC) AS prev_total, -- 获取前一行的最高pick status LAG(highest_pick_status) OVER (ORDER BY total_of_won_and_looking_good DESC, points_player DESC) AS prev_highest_pick_status, -- 验证当前行pick status是否高于前一行 CASE WHEN LAG(highest_pick_status) OVER (ORDER BY total_of_won_and_looking_good DESC, points_player DESC) IS NULL THEN '第一行,无需验证' WHEN highest_pick_status > LAG(highest_pick_status) OVER (ORDER BY total_of_won_and_looking_good DESC, points_player DESC) THEN '符合要求' ELSE '不符合:当前pick status未高于前一行' END AS pick_status_validation, -- 直观展示当前行与前一行的总和差值 total_of_won_and_looking_good - LAG(total_of_won_and_looking_good) OVER (ORDER BY total_of_won_and_looking_good DESC, points_player DESC) AS total_diff_from_prev FROM user_summary ORDER BY total_of_won_and_looking_good DESC, points_player DESC;
关键细节说明:
LAG()函数是实现行与行对比的核心,能直接获取排序后前一行的对应字段值- 排序规则严格遵循你的要求:优先按
total_of_won_and_looking_good降序,总和相同时按points_player降序(如果需要升序,把DESC改成ASC即可) pick_status_validation字段会自动标注当前行是否符合"pick status高于前一行"的要求,方便快速排查问题total_diff_from_prev字段直观展示总和的变化,满足你"核心对比total值"的需求
如果你的"pick status高于前一行"指的是用户单条pick记录(而非用户的最高状态),可以补充说明你的数据结构,我再调整适配方案。
内容的提问来源于stack exchange,提问作者user9686029
相关产品推荐
相关产品推荐

