NYC Congestion Pricing: A SQL Analysis

Did New York's January 2025 congestion pricing rollout change taxi demand, trip speeds, or revenue? A before/after analysis built entirely in SQL.

What this is

On January 5, 2025, New York City began charging vehicles a toll to enter Manhattan's Central Business District. This project compares NYC yellow taxi trip data from July-December 2024 (before the toll) against July-December 2025 (after), using the same six calendar months a year apart so the comparison isn't skewed by normal seasonal swings in ridership.

The data comes directly from the NYC Taxi & Limousine Commission, the city agency that publishes every taxi trip's pickup/dropoff time, location, distance, and fare. All analysis below was done in SQL using DuckDB, with no spreadsheet or external tool involved in the calculations themselves.

A methodology note: the toll only applies to a specific zone within Manhattan below 60th Street. Reproducing that exact boundary requires joining against a separate map file the TLC publishes. As a simpler stand-in, this analysis compares all of Manhattan against the other boroughs. That's a reasonable approximation but not the precise tolling boundary - keep that in mind when reading the borough-level results below.

Explore the data yourself

The box below is a full SQL query tool running live in your browser (via Datasette Lite) - nothing is sent to a server. It's loaded with five tables, each described below. Try one of the example queries, or write your own.

Open in a full browser tab

The tables

monthly_summary - one row per month, with trip counts, average fare, average trip duration, total congestion fee revenue collected, and the percent change from the prior month.

ColumnMeaning
trip_monthThe calendar month this row summarizes
period"before" (2024) or "after" (2025)
trip_countTotal taxi trips that month
avg_fareAverage total amount paid per trip, in dollars
avg_duration_minAverage trip length, in minutes
total_congestion_feesTotal congestion pricing fees collected that month
pct_change_momPercent change in trip count vs. the previous month

daily_with_rolling - one row per calendar day across the full 12 months, with 7-day and 28-day rolling average trip counts, useful for spotting trends without day-to-day noise.

borough_comparison - trip volume and duration (including median and 90th-percentile duration) split by Manhattan vs. all other boroughs, for both time periods.

zone_rank_shift - the 20 busiest Manhattan pickup zones, showing each zone's popularity rank before and after, and how much that rank moved.

congestion_revenue - month-by-month congestion fee revenue for the "after" period only, including a running cumulative total.

Example queries to try

Copy any of these into the query box above.

SELECT * FROM monthly_summary ORDER BY trip_month;
SELECT pickup_area, period, trip_count, median_duration_min
FROM borough_comparison
ORDER BY pickup_area, period;
SELECT Zone, before_rank, after_rank, rank_change
FROM zone_rank_shift
ORDER BY rank_change DESC
LIMIT 10;
SELECT trip_month, total_fee_revenue, cumulative_revenue
FROM congestion_revenue
ORDER BY trip_month;

Findings

Overall taxi trip volume rose about 11% year-over-year across the six-month window, so the toll does not appear to have suppressed total taxi demand. That growth was uneven, however: trips originating in Manhattan grew a modest 7%, while trips in the other boroughs grew 36%, and median trip duration outside Manhattan dropped by almost 4 minutes even as Manhattan's own median duration ticked up slightly, a pattern consistent with some demand shifting toward, and traffic easing in, the outer boroughs. Rankings among Manhattan's busiest pickup zones barely moved, with the largest shift being only 3 spots. The congestion fee itself generated a steady $1.75M-$2.19M per month, totaling roughly $12.2M over July-December 2025.