sql - 根据组统计删除记录组
问题描述
我有以下两个示例表
团队
团队编号 | 队名 |
---|---|
1 | 熊 |
2 | 老虎队 |
3 | 狮子 |
4 | 鲨鱼 |
球员
玩家编号 | 姓名 | 团队编号 | 游戏时间 |
---|---|---|---|
1 | 约翰 | 1 | 5 |
2 | 亚当 | 1 | 4 |
3 | 史密斯 | 1 | 5 |
4 | 米歇尔 | 2 | 5 |
5 | 斯蒂芬妮 | 2 | 10 |
6 | 大卫 | 2 | 10 |
7 | 考特尼 | 2 | 2 |
8 | 坦率 | 2 | 7 |
9 | 特蕾莎 | 2 | 1 |
10 | 迈克尔 | 3 | 3 |
11 | 可能 | 4 | 1 |
12 | 丹尼尔 | 4 | 1 |
13 | 丽莎 | 4 | 4 |
我需要一个符合以下条件的选择语句
- 选择所有少于 4 名球员的球队
- 计算出这些球队中所有球员的总上场时间,并以此为基础按降序对结果表进行排序
根据给出的示例,我想要一个如下所示的表:
团队
队名 | 玩家人数 | 总游戏时间 |
---|---|---|
熊 | 3 | 14 |
鲨鱼 | 3 | 6 |
狮子 | 1 | 3 |
最后,我想从上一个表中删除所有偶数行,所以最终表看起来像:
队名 | 玩家人数 | 总游戏时间 |
---|---|---|
熊 | 3 | 14 |
狮子 | 1 | 3 |
解决方案
您可以尝试以下方法:
查询 #1
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 Name"
HAVING
COUNT(p."Player ID") < 4
ORDER BY
SUM(p."Playtime") DESC;
队名 | 玩家人数 | 总游戏时间 |
---|---|---|
熊 | 3 | 14 |
鲨鱼 | 3 | 6 |
狮子 | 1 | 3 |
查询 #2
SELECT
t1."Team Name",
t1."Num Players",
t1."Total Playtime"
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY SUM(p."Playtime") DESC) as rn,
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 Name"
HAVING
COUNT(p."Player ID") < 4
) t1
WHERE MOD(rn,2)=1
ORDER BY rn;
队名 | 玩家人数 | 总游戏时间 |
---|---|---|
熊 | 3 | 14 |
狮子 | 1 | 3 |
让我知道这是否适合您。
推荐阅读
- sql - 根据用户在 Netezza SQL 中的输入计算某些字段
- go - Go GRPC opentracing 中的子跨度
- google-sheets - 使用 Google 表格打开文件时发现损坏的数据
- javascript - 悬停时在 X 轴上显示自定义刻度
- java - Spring将来自PUT的输入存储在列表中
- html - 如何处理 RobotFramework 中 div 类的切换窗口
- java - Spring boot @MockMvcTest MockHttpServletResponse 总是返回空体
- linux - 如何在 KeepassXC 自动输入功能中使用用户定义的属性?
- jquery - 通过可嵌套更改时将按钮删除/添加到类别
- python-3.x - 一个简单的计算器程序的问题,输入数字零时似乎总是出现错误