有人能给我解释一下SQL查询吗

  • 本文关键字:一下 SQL 查询 解释 sql
  • 更新时间 :
  • 英文 :

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表上的外部查询的作用是,对于每个航班,它都会得到idcarrierflight_sequence_numberflight_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中的每一行,它计算严格小于该行上的idids的数量,然后将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;

最新更新