基于组统计筛选球队数据并删除偶数行的SQL查询实现需求
球队球员数据统计SQL实现方案
前置样例表
- Teams表(存储球队基础信息)
| Team ID | Team Name |
|---|---|
| 1 | Bears |
| 2 | Tigers |
| 3 | Lions |
| 4 | Sharks |
- Players表(存储球员基础信息与上场时长)
| Player ID | Name | Team ID | Playtime |
|---|---|---|---|
| 1 | John | 1 | 5 |
| 2 | Adam | 1 | 4 |
| 3 | Smith | 1 | 5 |
| 4 | Michelle | 2 | 5 |
| 5 | Stephanie | 2 | 10 |
| 6 | David | 2 | 10 |
| 7 | Courtney | 2 | 2 |
| 8 | Frank | 2 | 7 |
| 9 | Teresa | 2 | 1 |
| 10 | Michael | 3 | 3 |
| 11 | May | 4 | 1 |
| 12 | Daniel | 4 | 1 |
| 13 | Lisa | 4 | 4 |
查询要求
- 第一步:筛选出队员总数量少于4人的所有球队
- 第二步:统计符合条件球队的球员总人数、总上场时长,按总上场时长降序排列,生成包含
Team Name、Num Players、Total Playtime三个字段的中间表 - 第三步:剔除中间表的所有偶数行,得到最终结果
实现代码(支持窗口函数的主流数据库通用,如MySQL 8.0+、PostgreSQL、SQL Server等)
WITH intermediate_table AS ( SELECT t.`Team Name`, COUNT(p.`Player ID`) AS `Num Players`, SUM(p.Playtime) AS `Total Playtime` FROM Teams t LEFT JOIN Players p ON t.`Team ID` = p.`Team ID` GROUP BY t.`Team ID`, t.`Team Name` HAVING COUNT(p.`Player ID`) < 4 ORDER BY `Total Playtime` DESC ) SELECT `Team Name`, `Num Players`, `Total Playtime` FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY `Total Playtime` DESC) AS row_num FROM intermediate_table ) t WHERE row_num % 2 = 1;
代码逻辑说明
- CTE部分先关联球队和球员表,按球队维度分组,通过
HAVING子句筛选出球员数小于4的球队,同时统计每个符合条件球队的球员总数和总上场时长,按总时长降序生成中间表 - 外层查询通过
ROW_NUMBER()窗口函数给中间表的每行分配连续行号,最后筛选行号为奇数的行,即完成剔除偶数行的要求
执行结果
| Team Name | Num Players | Total Playtime |
|---|---|---|
| Bears | 3 | 14 |
| Lions | 1 | 3 |
内容的提问来源于stack exchange,提问作者DataScience99
相关产品推荐
相关产品推荐

