有人可以向我解释一下SQL查询

时间:2018-11-28 10:58:54

标签: 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;

我不能得到这个查询,有人可以向我解释这是做什么的吗?

已经感谢。

3 个答案:

答案 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表上的外部查询的作用是,对于每个排程,它都会获得idcarrierflight_sequence_numberflight_sequence_numberf1上的内部查询通过计算当前飞行之前(带有子句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;