【问题标题】:SQL JOIN return only the first matchSQL JOIN 只返回第一个匹配项
【发布时间】:2022-01-01 18:27:12
【问题描述】:

我认为这是一个基本问题,但我无法弄清楚。我是新手,所以请多多包涵。

我正在分析 FIFA 比赛中的球员数据,我想获得一个表格,其中包含每个球员的最高评分以及发生这种情况的最早年龄。

这是数据示例:

id name position rating age
1 James RW 70 20
1 James RW 71 21
2 Frank CB 73 23
2 Frank CB 73 24
3 Miles CM 75 27
3 Miles CM 74 28

这是查询应该返回的内容:

id name position rating age
1 James RW 71 21
2 Frank CB 73 23
3 Miles CM 75 27

我以为我可以先让每个球员的总分最高,然后通过JOIN 得到年龄,但这样其他年份的球员也有相同的最高评分。

id name position rating age
1 James RW 71 21
2 Frank CB 73 23
2 Frank CB 73 24
3 Miles CM 75 27

谢谢,

【问题讨论】:

    标签: sql join google-bigquery


    【解决方案1】:

    一种方法使用ROW_NUMBERQUALIFY

    SELECT *
    FROM yourTable
    WHERE true
    QUALIFY ROW_NUMBER() OVER (PARTITION BY id ORDER BY rating DESC, age) = 1;
    

    【讨论】:

      【解决方案2】:

      试试这个(可能会快一点):

      with mytable as (
          select 1 as id, "James" as name, "RW" as position, 70 as rating,  20 as age union all 
          select 1, "James", "RW", 71, 21 union all
          select 2, "Frank", "CB", 73, 23 union all
          select 2, "Frank", "CB", 73, 24 union all
          select 3, "Miles", "CM", 75, 27 union all
          select 3, "Miles", "CM", 74, 28
      )
      select array_agg(t order by rating desc, age asc limit 1)[OFFSET(0)].*,
      from mytable as t
      group by t.id
      

      【讨论】:

        【解决方案3】:

        如果你愿意,也可以试试这个。我认为这是您需要的。

        select p1.id,
               p1.name,
               p1.pos,
               max(p1.rating),
               p1.age
          from players p1
          join (select name, min(age) min_age
                  from players 
                 group by 1) p2 on p1.name = p2.name and p1.age = p2.min_age
         group by p1.id, p1.name, p1.pos, p1.age
             
        

        【讨论】:

        • 它给了我来自 JOIN 的错误;错误:无法识别的名称:p2;从这部分 JOIN on p1.id = p2.id
        • 哦,我的错,我编辑了代码,请测试。
        • 我现在明白你做了什么。我也尝试过,但是当最高评级不是在数据显示的第一年时给出了错误的输出(就像在詹姆斯的情况下)。对于 James,它显示 max_rating = 70,age = 20,什么时候应该是 71、21。无论如何,感谢您的意见。
        • 我明白了,因为我加入了 p1.id = p2.id,所以我再次编辑 :D 只是为了解开谜团 :D
        • 我认为我们不能用 JOIN 来做到这一点。问题是最高评分不是在玩家出现的第一年。在子查询中,iyou 获得了玩家出现在表中的最小年龄,而不是玩家获得最高评分时的最小年龄。如果玩家可以有多个相同年龄的评分,则此答案将是正确的,但事实并非如此。无论如何,谢谢你帮助我,如果有一天我知道如何让它与 JOIN 一起工作,我会告诉你的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多