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;
伙计们,我不知道这个问题,有人能解释一下这是怎么回事吗?
让我们对表格进行别名以更好地理解:
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
(并加一来计算的,因为当前航班不在计数中。
SQL从特定的Carrier获取Last ID并求和1。它将从运营商获得下一个ID
这是您的查询:
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
s的数量,然后将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;