runtime
39 / 88

lesson 39 Window functions · advanced

Compare rows with LAG

Compare each row with an earlier row.

the idea

LAG(column) returns the value from the previous row in the window order; LEAD returns the next. With PARTITION BY tail_number ORDER BY scheduled_departure, the previous row is the same aircraft’s previous flight, so you can compare consecutive legs.

Dataset: U.S. Flights

The tables the challenges use, with their first 6 rows. Under each column name: the kind of value it holds, and which table it links to.

flights25 columns · 124,460 rows
flight_idnumber · unique idflight_datedate · links to calendarairline_codetext · links to airlinesflight_numbernumbertail_numbertextorigintext · links to airportsdestinationtext · links to airportsroute_idnumber · links to routesscheduled_departuredate & timeactual_departuredate & timedeparture_delaynumbertaxi_out_minutesnumberscheduled_arrivaldate & timeactual_arrivaldate & timearrival_delaynumberair_time_minutesnumberdistance_milesnumbercancellednumbercancellation_codetext · links to cancellation_reasonsdivertednumbercarrier_delaynumberweather_delaynumbernas_delaynumbersecurity_delaynumberlate_aircraft_delaynumber
12025-01-01AA2158N960NNSMFORD50422025-01-01 00:252025-01-01 00:3712102025-01-01 06:342025-01-01 06:18-1620217810NULL0NULLNULLNULLNULLNULL
22025-01-01AS150N524ASANCLAX902025-01-01 00:442025-01-01 00:42-2102025-01-01 07:082025-01-01 06:44-2428123450NULL0NULLNULLNULLNULLNULL
32025-01-01AA2319N861NNPHXORD40782025-01-01 00:452025-01-01 00:39-6172025-01-01 05:162025-01-01 04:44-3216014400NULL0NULLNULLNULLNULLNULL
42025-01-01UA2232N24516SFOORD48202025-01-01 00:592025-01-01 00:56-3312025-01-01 07:262025-01-01 07:23-321418460NULL0NULLNULLNULLNULLNULL
52025-01-01AA575N163AADFWCLT14572025-01-01 05:002025-01-01 04:55-5232025-01-01 08:322025-01-01 08:14-181059360NULL0NULLNULLNULLNULLNULL
62025-01-01AA1196N338STEWRMIA18082025-01-01 05:002025-01-01 04:53-7222025-01-01 08:202025-01-01 08:10-1015110850NULL0NULLNULLNULLNULLNULL
flight_idnumber · unique id
1
flight_datedate · links to calendar
2025-01-01
airline_codetext · links to airlines
AA
flight_numbernumber
2158
tail_numbertext
N960NN
origintext · links to airports
SMF
destinationtext · links to airports
ORD
route_idnumber · links to routes
5042
scheduled_departuredate & time
2025-01-01 00:25
actual_departuredate & time
2025-01-01 00:37
departure_delaynumber
12
taxi_out_minutesnumber
10
scheduled_arrivaldate & time
2025-01-01 06:34
actual_arrivaldate & time
2025-01-01 06:18
arrival_delaynumber
-16
air_time_minutesnumber
202
distance_milesnumber
1781
cancellednumber
0
cancellation_codetext · links to cancellation_reasons
NULL
divertednumber
0
carrier_delaynumber
NULL
weather_delaynumber
NULL
nas_delaynumber
NULL
security_delaynumber
NULL
late_aircraft_delaynumber
NULL
flight_idnumber · unique id
2
flight_datedate · links to calendar
2025-01-01
airline_codetext · links to airlines
AS
flight_numbernumber
150
tail_numbertext
N524AS
origintext · links to airports
ANC
destinationtext · links to airports
LAX
route_idnumber · links to routes
90
scheduled_departuredate & time
2025-01-01 00:44
actual_departuredate & time
2025-01-01 00:42
departure_delaynumber
-2
taxi_out_minutesnumber
10
scheduled_arrivaldate & time
2025-01-01 07:08
actual_arrivaldate & time
2025-01-01 06:44
arrival_delaynumber
-24
air_time_minutesnumber
281
distance_milesnumber
2345
cancellednumber
0
cancellation_codetext · links to cancellation_reasons
NULL
divertednumber
0
carrier_delaynumber
NULL
weather_delaynumber
NULL
nas_delaynumber
NULL
security_delaynumber
NULL
late_aircraft_delaynumber
NULL
flight_idnumber · unique id
3
flight_datedate · links to calendar
2025-01-01
airline_codetext · links to airlines
AA
flight_numbernumber
2319
tail_numbertext
N861NN
origintext · links to airports
PHX
destinationtext · links to airports
ORD
route_idnumber · links to routes
4078
scheduled_departuredate & time
2025-01-01 00:45
actual_departuredate & time
2025-01-01 00:39
departure_delaynumber
-6
taxi_out_minutesnumber
17
scheduled_arrivaldate & time
2025-01-01 05:16
actual_arrivaldate & time
2025-01-01 04:44
arrival_delaynumber
-32
air_time_minutesnumber
160
distance_milesnumber
1440
cancellednumber
0
cancellation_codetext · links to cancellation_reasons
NULL
divertednumber
0
carrier_delaynumber
NULL
weather_delaynumber
NULL
nas_delaynumber
NULL
security_delaynumber
NULL
late_aircraft_delaynumber
NULL
flight_idnumber · unique id
4
flight_datedate · links to calendar
2025-01-01
airline_codetext · links to airlines
UA
flight_numbernumber
2232
tail_numbertext
N24516
origintext · links to airports
SFO
destinationtext · links to airports
ORD
route_idnumber · links to routes
4820
scheduled_departuredate & time
2025-01-01 00:59
actual_departuredate & time
2025-01-01 00:56
departure_delaynumber
-3
taxi_out_minutesnumber
31
scheduled_arrivaldate & time
2025-01-01 07:26
actual_arrivaldate & time
2025-01-01 07:23
arrival_delaynumber
-3
air_time_minutesnumber
214
distance_milesnumber
1846
cancellednumber
0
cancellation_codetext · links to cancellation_reasons
NULL
divertednumber
0
carrier_delaynumber
NULL
weather_delaynumber
NULL
nas_delaynumber
NULL
security_delaynumber
NULL
late_aircraft_delaynumber
NULL
flight_idnumber · unique id
5
flight_datedate · links to calendar
2025-01-01
airline_codetext · links to airlines
AA
flight_numbernumber
575
tail_numbertext
N163AA
origintext · links to airports
DFW
destinationtext · links to airports
CLT
route_idnumber · links to routes
1457
scheduled_departuredate & time
2025-01-01 05:00
actual_departuredate & time
2025-01-01 04:55
departure_delaynumber
-5
taxi_out_minutesnumber
23
scheduled_arrivaldate & time
2025-01-01 08:32
actual_arrivaldate & time
2025-01-01 08:14
arrival_delaynumber
-18
air_time_minutesnumber
105
distance_milesnumber
936
cancellednumber
0
cancellation_codetext · links to cancellation_reasons
NULL
divertednumber
0
carrier_delaynumber
NULL
weather_delaynumber
NULL
nas_delaynumber
NULL
security_delaynumber
NULL
late_aircraft_delaynumber
NULL
flight_idnumber · unique id
6
flight_datedate · links to calendar
2025-01-01
airline_codetext · links to airlines
AA
flight_numbernumber
1196
tail_numbertext
N338ST
origintext · links to airports
EWR
destinationtext · links to airports
MIA
route_idnumber · links to routes
1808
scheduled_departuredate & time
2025-01-01 05:00
actual_departuredate & time
2025-01-01 04:53
departure_delaynumber
-7
taxi_out_minutesnumber
22
scheduled_arrivaldate & time
2025-01-01 08:20
actual_arrivaldate & time
2025-01-01 08:10
arrival_delaynumber
-10
air_time_minutesnumber
151
distance_milesnumber
1085
cancellednumber
0
cancellation_codetext · links to cancellation_reasons
NULL
divertednumber
0
carrier_delaynumber
NULL
weather_delaynumber
NULL
nas_delaynumber
NULL
security_delaynumber
NULL
late_aircraft_delaynumber
NULL

first 6 of 124,460 rows · your queries use all of them

worked example

Run these steps in order to see the idea before you write your own query. The step marked “the pattern” is what the challenges ask for. Running the example does not count toward progress.

  1. Look at the previous leg. Run this. LAG() pulls the prior row’s destination for the same tail number—handy for spotting whether origin matches where the plane last landed.

    step-1.sql
    SELECT
      flight_id,
      tail_number,
      origin,
      destination,
      LAG(destination) OVER (PARTITION BY tail_number ORDER BY scheduled_departure, flight_id) AS previous_destination
    FROM flights
    WHERE flight_date = '2025-01-15' AND tail_number IS NOT NULL
    LIMIT 20;
  2. Compare delay to the last arrival. Run this. For each operated flight you see this leg’s departure delay beside the previous leg’s arrival delay on that aircraft. The first leg of the day shows NULL for the lag column.

    step-2.sql
    SELECT
      flight_id,
      tail_number,
      departure_delay,
      LAG(arrival_delay) OVER (PARTITION BY tail_number ORDER BY scheduled_departure, flight_id) AS previous_arrival_delay
    FROM flights
    WHERE flight_date = '2025-01-15'
      AND cancelled = 0
      AND tail_number IS NOT NULL
    LIMIT 20;
  3. Put it together. The lesson's pattern in one query.the pattern

    example.sql
    SELECT
      flight_id,
      tail_number,
      origin,
      destination,
      LAG(destination) OVER (PARTITION BY tail_number ORDER BY scheduled_departure, flight_id) AS previous_destination
    FROM flights
    WHERE flight_date = '2025-01-15' AND tail_number IS NOT NULL;

common mistake

The first row of each partition has no previous row: LAG returns NULL, not zero. Local times are only comparable at the same airport, which is exactly where an aircraft arrives and departs again.

challenge 1

For operated flights (cancelled = 0) on 2025-01-15 with a tail number, return flight_id, tail_number, arrival_delay and previous_arrival_delay: the arrival delay of the same aircraft’s previous operated flight that day.

what to return

Columns
flight_idtail_numberarrival_delayprevious_arrival_delay in this order
Rows
any order
challenge-1.sql
 
To master this lesson, solve both challenges without hints and pass the concept check. 3 of 3 to go.
Compare rows with LAG — Window functions · Runtime