【问题标题】:sql - Query to get the teams that were in the top 6 in the last 5 years of a championshipsql - 查询在过去 5 年的冠军赛中进入前 6 名的球队
【发布时间】:2018-01-14 06:28:22
【问题描述】:

所以基本上我有 3 张桌子:

teams(id, name)

championship(id, name, year)

results(id_team, id_championship, points)

我想获得在过去 5 年中进入特定锦标赛前 6 名的球队。

我现在所做的是使用内部连接连接所有表并按年份过滤。

问题是,我不知道如何限制过滤前 6 名并以某种方式显示此结果。

我知道这可能是一个非常基本的问题,但我在上面浪费了很多时间。

编辑:

select * from teans as t 
inner join result as r 
inner join championship as c
on t.id=r.id_team and c.id=r.id_championship
where ano between 2012 and 2017;

这就是我现在所拥有的。现在,我不知道如何在 group by 子句中进行前 6 个查询,这就是我的想法。按年份分组并限制前 6 个结果。

我是 SQL 的初学者,所以我知道我认为这不是 100% 正确的。

编辑2:

我用来测试的表。我只是想搜索 1999 年和 2000 年。只是为了让现在更容易。

+---------+--------------+--------+
|   id    |     name     |  year  |
+---------+--------------+--------+
|     "1" | "Brasileito" | "1999" |
|     "2" | "Brasileito" | "2000" |
|     "3" | "Brasileito" | "2001" |
+---------+--------------+--------+

+---------+-----------------+------+
| id_team | id_championship | year |
+---------+-----------------+------+
|    "1"  | "1"             | "10" |
| "2"     | "1"             | "7"  |
| "3"     | "1"             | "7"  |
| "4"     | "1"             | "7"  |
| "5"     | "1"             | "7"  |
| "1"     | "2"             | "10" |
| "2"     | "2"             | "7"  |
| "3"     | "2"             | "11" |
| "4"     | "2"             | "7"  |
| "5"     | "2"             | "6"  |
+---------+-----------------+------+

+-----+-------------+-------+
| id  |    name     | state |
+-----+-------------+-------+
| "1" | "Cruzeiro"  | "MG"  |
| "2" | "Flamengo"  | "RJ"  |
| "3" | "Vasco"     | "RJ"  |
| "4" | "Galo"      | "MG"  |
| "5" | "São Paulo" | "SP"  |
+-----+-------------+-------+

【问题讨论】:

  • 请查看最小、完整的可验证示例,以便我们为您提供帮助。 link
  • 我在编辑中发布了我现在拥有的内容。
  • 我必须在 SQLite 中执行此操作。所以我几乎掌握了基本的 SQL 知识。
  • 我建议从简单开始,逐步建立答案。 1年前6名怎么样?
  • 这个我可以做到,但我不知道如何在一个查询中使用所有 5 年。

标签: sql sqlite


【解决方案1】:

考虑用相关子查询计算一个冠军rank,然后用它来过滤前6名:

WITH cte AS
  (SELECT * FROM teams AS t 
   INNER JOIN result AS r 
   INNER JOIN championship AS c
     ON t.id=r.id_team AND c.id=r.id_championship
   WHERE ano BETWEEN 2012 AND 2017)

SELECT main.*
FROM 
  (SELECT t.*, (SELECT COUNT(*) 
                FROM cte sub
                WHERE sub.points >= t.points 
                AND sub.ano = t.ano
                AND sub.id_championship = t.id_championship) AS rank
   FROM cte t) AS main
WHERE main.rank <= 6

【讨论】:

  • 太棒了!很高兴能提供帮助。
【解决方案2】:

此查询将为您提供在特定锦标赛中得分最高的球队列表,仅限于前 6 名。不确定这是否是您想要的?

SELECT *
FROM RESULTS AS R
INNER JOIN TEAMS AS T ON T.ID = R.ID_TEAM
INNER JOIN CHAMPIONSHIP AS C ON C.ID = R.ID_CHAMPIONSHIP
WHERE C.YEAR >= add_months( sysdate, -12*5 
ORDER BY R.POINTS DESC
LIMIT 6;

【讨论】:

  • 是的,但这必须在最近 5 年内完成。所以我必须让过去 5 年中的任何一年都进入前 6 名的球队。
  • 我编辑了过去 5 年的 sql 查询@WilsonPena
  • 这并没有给我每年的前 6 名。它只是按积分排名前 6 位。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2019-04-09
  • 2019-03-22
  • 1970-01-01
相关资源
最近更新 更多