gpt4 book ai didi

sql - 每个左连接返回 1 个结果

转载 作者:行者123 更新时间:2023-12-04 15:46:26 25 4
gpt4 key购买 nike

目前我正在对两个表执行左连接。第一个表有一个 id 和一个人的名字,第二个表有一个 id,表 1 中的一个人的 id,然后是一个时间戳(航类的)。

People                             Flights
id | name id | person_id | time
------------ ---------------------------
1 Dave 1 1 1284762115
2 Becky 2 1 1284787352
3 2 1284772629
4 2 1286432934
5 1 1283239480

当我执行左连接时,我得到了人员列表和他们的飞行时间,但我想要的只是飞​​行时间具有最高 ID 的人员列表

我一直在用

   SELECT p.id, p.name max(f.time) 
FROM People p
LEFT JOIN Flights f ON p.id = f.person_id
GROUP BY p.id, p.name

但是,这只是给我最后一次飞行时间,而不是上传到系统中的最后一次飞行时间(即最高 ID)。

1 Dave  1284787352
2 Becky 1286432934

重申一下,我想查看此人的姓名,以及他们上次上传(最高 ID)飞行时间的飞行时间。

1 Dave  1283239480
2 Becky 1286432934

最佳答案

使用:

SELECT p.id,
p.name,
f.time
FROM PEOPLE p
JOIN FLIGHTS f ON f.person_id = p.id
JOIN (SELECT f.person_id,
MAX(f.id) AS max_id
FROM FLIGHTS f
GROUP BY f.person_id) x ON x.person_id = f.person_id
AND x.max_id = f.id

如果您使用的是支持分析的数据库:

SELECT p.id,
p.name,
x.time
FROM PEOPLE p
JOIN (SELECT f.person_id,
f.time,
ROW_NUMBER() OVER(PARTITION BY f.person_id
ORDER BY f.id DESC) AS rk
FROM FLIGHTS f) x ON x.person_id = p.id
AND x.rk = 1

如果你想要人,包括那些没有航类的人:

   SELECT p.id,
p.name,
f.time
FROM PEOPLE p
LEFT JOIN FLIGHTS f ON f.person_id = p.id
JOIN (SELECT f.person_id,
MAX(f.id) AS max_id
FROM FLIGHTS f
GROUP BY f.person_id) x ON x.person_id = f.person_id
AND x.max_id = f.id

...和分析版本:

   SELECT p.id,
p.name,
x.time
FROM PEOPLE p
LEFT JOIN (SELECT f.person_id,
f.time,
ROW_NUMBER() OVER(PARTITION BY f.person_id
ORDER BY f.id DESC) AS rk
FROM FLIGHTS f) x ON x.person_id = p.id
AND x.rk = 1

关于sql - 每个左连接返回 1 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3747976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com