runtime
13 / 88

lesson 13 Calculations & data quality · intermediate

Filter groups with HAVING

Filter summaries after grouping rows.

the idea

WHERE filters input rows before grouping. HAVING filters groups after the aggregates are computed. Put a condition where its grain is: trip conditions in WHERE, group conditions in HAVING.

Dataset: Mobility

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.

trips19 columns · 128,620 rows
trip_idnumber · unique idvendor_idnumber · links to vendorspickup_atdate & timedropoff_atdate & timepassenger_countnumbertrip_distance_milesdecimalrate_code_idnumber · links to rate_codesstore_and_fwd_flagtextpickup_zone_idnumber · links to zonesdropoff_zone_idnumber · links to zonespayment_type_idnumber · links to payment_typesfare_amountdecimaltip_amountdecimaltolls_amountdecimalsurcharge_amountdecimalcongestion_surchargedecimalairport_feedecimalcbd_congestion_feedecimaltotal_amountdecimal
122024-12-31 21:33:432024-12-31 21:39:0021.121N179727.9002.500010.4
222025-01-01 00:01:282025-01-01 00:21:1215.511N249112125.47.476.942.52.50044.81
322025-01-01 00:02:462025-01-01 00:21:2712.981N158162118.45.8502.52.50029.25
422025-01-01 00:04:292025-01-01 00:55:58931.975N132265290020.321000111.32
522025-01-01 00:05:492025-01-01 00:20:0023.451N263107117.74.5402.52.50027.24
622025-01-01 00:06:442025-01-01 00:32:0718.041N132191235.9002.500038.4
trip_idnumber · unique id
1
vendor_idnumber · links to vendors
2
pickup_atdate & time
2024-12-31 21:33:43
dropoff_atdate & time
2024-12-31 21:39:00
passenger_countnumber
2
trip_distance_milesdecimal
1.12
rate_code_idnumber · links to rate_codes
1
store_and_fwd_flagtext
N
pickup_zone_idnumber · links to zones
179
dropoff_zone_idnumber · links to zones
7
payment_type_idnumber · links to payment_types
2
fare_amountdecimal
7.9
tip_amountdecimal
0
tolls_amountdecimal
0
surcharge_amountdecimal
2.5
congestion_surchargedecimal
0
airport_feedecimal
0
cbd_congestion_feedecimal
0
total_amountdecimal
10.4
trip_idnumber · unique id
2
vendor_idnumber · links to vendors
2
pickup_atdate & time
2025-01-01 00:01:28
dropoff_atdate & time
2025-01-01 00:21:12
passenger_countnumber
1
trip_distance_milesdecimal
5.51
rate_code_idnumber · links to rate_codes
1
store_and_fwd_flagtext
N
pickup_zone_idnumber · links to zones
249
dropoff_zone_idnumber · links to zones
112
payment_type_idnumber · links to payment_types
1
fare_amountdecimal
25.4
tip_amountdecimal
7.47
tolls_amountdecimal
6.94
surcharge_amountdecimal
2.5
congestion_surchargedecimal
2.5
airport_feedecimal
0
cbd_congestion_feedecimal
0
total_amountdecimal
44.81
trip_idnumber · unique id
3
vendor_idnumber · links to vendors
2
pickup_atdate & time
2025-01-01 00:02:46
dropoff_atdate & time
2025-01-01 00:21:27
passenger_countnumber
1
trip_distance_milesdecimal
2.98
rate_code_idnumber · links to rate_codes
1
store_and_fwd_flagtext
N
pickup_zone_idnumber · links to zones
158
dropoff_zone_idnumber · links to zones
162
payment_type_idnumber · links to payment_types
1
fare_amountdecimal
18.4
tip_amountdecimal
5.85
tolls_amountdecimal
0
surcharge_amountdecimal
2.5
congestion_surchargedecimal
2.5
airport_feedecimal
0
cbd_congestion_feedecimal
0
total_amountdecimal
29.25
trip_idnumber · unique id
4
vendor_idnumber · links to vendors
2
pickup_atdate & time
2025-01-01 00:04:29
dropoff_atdate & time
2025-01-01 00:55:58
passenger_countnumber
9
trip_distance_milesdecimal
31.97
rate_code_idnumber · links to rate_codes
5
store_and_fwd_flagtext
N
pickup_zone_idnumber · links to zones
132
dropoff_zone_idnumber · links to zones
265
payment_type_idnumber · links to payment_types
2
fare_amountdecimal
90
tip_amountdecimal
0
tolls_amountdecimal
20.32
surcharge_amountdecimal
1
congestion_surchargedecimal
0
airport_feedecimal
0
cbd_congestion_feedecimal
0
total_amountdecimal
111.32
trip_idnumber · unique id
5
vendor_idnumber · links to vendors
2
pickup_atdate & time
2025-01-01 00:05:49
dropoff_atdate & time
2025-01-01 00:20:00
passenger_countnumber
2
trip_distance_milesdecimal
3.45
rate_code_idnumber · links to rate_codes
1
store_and_fwd_flagtext
N
pickup_zone_idnumber · links to zones
263
dropoff_zone_idnumber · links to zones
107
payment_type_idnumber · links to payment_types
1
fare_amountdecimal
17.7
tip_amountdecimal
4.54
tolls_amountdecimal
0
surcharge_amountdecimal
2.5
congestion_surchargedecimal
2.5
airport_feedecimal
0
cbd_congestion_feedecimal
0
total_amountdecimal
27.24
trip_idnumber · unique id
6
vendor_idnumber · links to vendors
2
pickup_atdate & time
2025-01-01 00:06:44
dropoff_atdate & time
2025-01-01 00:32:07
passenger_countnumber
1
trip_distance_milesdecimal
8.04
rate_code_idnumber · links to rate_codes
1
store_and_fwd_flagtext
N
pickup_zone_idnumber · links to zones
132
dropoff_zone_idnumber · links to zones
191
payment_type_idnumber · links to payment_types
2
fare_amountdecimal
35.9
tip_amountdecimal
0
tolls_amountdecimal
0
surcharge_amountdecimal
2.5
congestion_surchargedecimal
0
airport_feedecimal
0
cbd_congestion_feedecimal
0
total_amountdecimal
38.4

first 6 of 128,620 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. Count trips in each payment type. Run this. GROUP BY gives one row per payment_type_id with a trip count.

    step-1.sql
    SELECT payment_type_id, COUNT(*) AS trips
    FROM trips
    GROUP BY payment_type_id;
  2. Drop small groups with HAVING. Run this. HAVING runs after grouping and keeps only groups with more than 10,000 trips.the pattern

    example.sql
    SELECT payment_type_id, COUNT(*) AS trips
    FROM trips
    GROUP BY payment_type_id
    HAVING COUNT(*) > 10000;

common mistake

WHERE fare_amount > 20 removes cheap trips; HAVING AVG(fare_amount) > 20 removes zones whose average is low. They answer different questions.

challenge 1

Return pickup_zone_id and trip_count for pickup zones with at least 1,000 trips.

what to return

Columns
pickup_zone_idtrip_count 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.
Filter groups with HAVING — Calculations & data quality · Runtime