SELECT carrier, id,
(SELECT COUNT(*) FROM flights f
WHERE f.id < flights.id
AND f.carrier=flights.carrier) + 1 AS flight_sequence_number
FROM flights;
我不能得到这个查询,有人可以向我解释这是做什么的吗?
已经感谢。
答案 0 :(得分:1)
让我们更好地理解别名表:
SELECT carrier, id,
(SELECT COUNT(*) FROM flights f1
WHERE f1.id < f2.id
AND f1.carrier=f2.carrier) + 1 AS flight_sequence_number
FROM flights f2;
f2
表上的外部查询的作用是,对于每个排程,它都会获得id
,carrier
和flight_sequence_number
。 flight_sequence_number
由f1
上的内部查询通过计算当前飞行之前(带有子句f1.id < f2.id
)和具有相同carrier
的所有飞行事件的发生来计算(带有条款f1.carrier=f2.carrier
)并加上一个,因为当前的排期将不计入。
答案 1 :(得分:0)
SQL正在从特定运营商处获取最后一个ID并求和1。它将从运营商处获取下一个ID。
答案 2 :(得分:0)
这是您的查询:
SELECT f.carrier, f.id,
(SELECT COUNT(*) + 1
FROM flights f2
WHERE f2.id < f.id AND
f2.carrier = f.carrier
) as flight_sequence_number
FROM flights f;
为了清楚起见,我对内容进行了一些重新排列。
这是做什么的?对于flights
中的每一行,它计数的id
数严格小于该行上的id
,然后加上1
。
简而言之,它枚举每个载体的行。通常使用窗口函数编写此逻辑:
select f.*,
rank() over (partition by f.carrier order by f.id) as flight_sequence_number
from flights f;
在(非常合理的)假设中,id
在表中是唯一的,这将更通俗地写成row_number()
:
select f.*,
row_number() over (partition by f.carrier order by f.id) as flight_sequence_number
from flights f;