我認為這是一個基本問題,但我無法弄清楚。我是新手,所以請耐心等待。
我正在分析 FIFA 比賽的球員資料,我想得到一個表格,其中包含每個球員的最高評分以及發生這種情況的最早年齡。
這是資料的示例:
| ID | 姓名 | 位置 | 評分 | 年齡 |
|---|---|---|---|---|
| 1 | 詹姆士 | RW | 70 | 20 |
| 1 | 詹姆士 | RW | 71 | 21 |
| 2 | 坦率 | CB | 73 | 23 |
| 2 | 坦率 | CB | 73 | 24 |
| 3 | 萬里 | 厘米 | 75 | 27 |
| 3 | 萬里 | 厘米 | 74 | 28 |
這是查詢應該回傳的內容:
| ID | 姓名 | 位置 | 評分 | 年齡 |
|---|---|---|---|---|
| 1 | 詹姆士 | RW | 71 | 21 |
| 2 | 坦率 | CB | 73 | 23 |
| 3 | 萬里 | 厘米 | 75 | 27 |
我以為我可以先得到每個球員的最高總分,然后再做一個JOIN來得到年齡,但這給了其他年份球員的最高評分。
| ID | 姓名 | 位置 | 評分 | 年齡 |
|---|---|---|---|---|
| 1 | 詹姆士 | RW | 71 | 21 |
| 2 | 坦率 | CB | 73 | 23 |
| 2 | 坦率 | CB | 73 | 24 |
| 3 | 萬里 | 厘米 | 75 | 27 |
謝謝,
uj5u.com熱心網友回復:
試試這個(可能會快一點):
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

uj5u.com熱心網友回復:
一種方法是使用ROW_NUMBER有QUALIFY:
SELECT *
FROM yourTable
WHERE true
QUALIFY ROW_NUMBER() OVER (PARTITION BY id ORDER BY rating DESC, age) = 1;
uj5u.com熱心網友回復:
如果你愿意,也可以試試這個。我認為這就是你所需要的。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/365529.html
上一篇:更新表所連接的列
