From 32c6b0d98b56f263b1914e64b7b48d2377a71926 Mon Sep 17 00:00:00 2001 From: Halyna Romanyshyn <30292604+halyna1995@users.noreply.github.com> Date: Wed, 1 Jul 2026 23:08:11 +0200 Subject: [PATCH] Complete week 9 SQL assignment --- AI_ASSIST.md | 57 +++++++++++++++++++++++++-- assets/borough_count.png | Bin 0 -> 22156 bytes data_dictionary.md | 28 +++++++++----- schema_setup.sql | 32 ++++++++++++---- validation_queries.sql | 41 +++++++++++++++++--- verification_results.sql | 81 +++++++++++++++++++++++++++++++++++++-- 6 files changed, 208 insertions(+), 31 deletions(-) create mode 100644 assets/borough_count.png diff --git a/AI_ASSIST.md b/AI_ASSIST.md index 07efd00..dae1a80 100644 --- a/AI_ASSIST.md +++ b/AI_ASSIST.md @@ -6,16 +6,65 @@ Document one session where you used an LLM to help with a query or a design deci ## The problem -TODO: What were you trying to solve? Paste the relevant SQL or schema fragment. +I was confused about the meaning of primary keys and foreign keys in the Week 9 data model. In particular, I did not understand whether `vendor_id` could be used as the primary key in `vw_fact_trips`. + +The relevant views were: + +```sql +CREATE OR REPLACE VIEW dev_halyna.vw_dim_zones AS +SELECT + location_id, + zone, + borough +FROM nyc_taxi.raw_zones; + +CREATE OR REPLACE VIEW dev_halyna.vw_fact_trips AS +SELECT + vendor_id, + pickup_datetime::TIMESTAMP AS pickup_datetime, + dropoff_datetime, + pickup_location_id, + dropoff_location_id, + passenger_count, + trip_distance, + fare_amount, + tip_amount, + total_amount, + payment_type +FROM nyc_taxi.raw_trips +WHERE fare_amount >= 0; +``` ## The prompt -TODO: What did you ask the AI? Include the context you provided. +I asked the AI to explain the two views in beginner-friendly language and to clarify whether vendor_id is a primary key. + +I also asked what should be written in the data dictionary for: + +- the grain of each view +- the primary key +- the foreign keys +- the measures ## The response -TODO: What did it suggest? Did it work first try? +The AI explained that vendor_id is not a primary key because it does not identify one unique trip. The same vendor can appear in many different taxi trips. + +The AI explained the difference between the two views: + +vw_fact_trips is the fact view. One row represents one cleaned taxi trip. It contains measurable values such as passenger_count, trip_distance, fare_amount, tip_amount, and total_amount. +vw_dim_zones is the dimension view. One row represents one taxi zone. It contains descriptive information such as location_id, zone, and borough. + +The AI also explained that: + +vw_fact_trips has no explicit primary key because the raw trips table does not provide a single unique trip identifier. +pickup_location_id and dropoff_location_id are foreign keys because they refer to vw_dim_zones.location_id. +vw_dim_zones.location_id can be treated as the primary key because each taxi zone has one unique location ID. ## Reflection -TODO: Did you understand *why* the suggestion worked, or did you accept it blindly? +I understood why vendor_id is not a primary key. A primary key must uniquely identify one row, but many trips can have the same vendor_id. Therefore, vendor_id only describes the vendor, not the individual trip. + +I also understood the role of the two views in the star schema. The fact view stores trip events and numeric measures. The dimension view stores descriptive zone information. The fact view can be joined to the dimension view using pickup_location_id or dropoff_location_id. + +This helped me understand the data model, not just copy the SQL. diff --git a/assets/borough_count.png b/assets/borough_count.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2a2ef4220652957fae57461a7aa017be3096c0 GIT binary patch literal 22156 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�|^{&E2hDsYo$ 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 0 -; +WHERE fare_amount >= 0; + -- Join-readiness test (run after creating the views; it must run without error -- and return a count close to the vw_fact_trips row count): -- SELECT COUNT(*) FROM vw_fact_trips f -- JOIN vw_dim_zones d ON f.pickup_location_id = d.location_id; + +SELECT COUNT(*) AS joined_pickup_trip_count +FROM dev_halyna.vw_fact_trips AS f +JOIN dev_halyna.vw_dim_zones AS d + ON f.pickup_location_id = d.location_id; diff --git a/validation_queries.sql b/validation_queries.sql index 301b194..4d15eaf 100644 --- a/validation_queries.sql +++ b/validation_queries.sql @@ -4,17 +4,46 @@ -- Zero rows back means the check passed. -- 1. Duplicate check: are there rows with the same vendor_id, pickup_datetime, dropoff_datetime? --- TODO: GROUP BY the three columns and keep only groups with HAVING COUNT(*) > 1. - +SELECT + vendor_id, + pickup_datetime, + dropoff_datetime, + COUNT(*) AS duplicate_count +FROM nyc_taxi.raw_trips +GROUP BY + vendor_id, + pickup_datetime, + dropoff_datetime +HAVING COUNT(*) > 1 +ORDER BY duplicate_count DESC; -- 2. Null integrity: how many rows have a NULL pickup_location_id or dropoff_location_id? --- TODO: count the NULLs (COUNT(*) FILTER (WHERE ... IS NULL) is handy for several columns at once). - +SELECT + COUNT(*) FILTER (WHERE pickup_location_id IS NULL) AS null_pickup_location_id, + COUNT(*) FILTER (WHERE dropoff_location_id IS NULL) AS null_dropoff_location_id, + COUNT(*) FILTER ( + WHERE pickup_location_id IS NULL + OR dropoff_location_id IS NULL + ) AS rows_with_any_null_location_id +FROM nyc_taxi.raw_trips; -- 3. Range validation: what are the min and max fare_amount? Are there negative values? --- TODO: SELECT MIN(fare_amount), MAX(fare_amount), and a count of rows where fare_amount < 0. +SELECT + MIN(fare_amount) AS min_fare_amount, + MAX(fare_amount) AS max_fare_amount, + COUNT(*) FILTER (WHERE fare_amount < 0) AS negative_fare_amount_count +FROM nyc_taxi.raw_trips; -- 4. Relationship check: which pickup_location_id values in nyc_taxi.raw_trips do NOT exist in nyc_taxi.raw_zones? --- TODO: LEFT JOIN nyc_taxi.raw_zones ... WHERE z.location_id IS NULL (or NOT EXISTS). +SELECT + t.pickup_location_id, + COUNT(*) AS orphaned_trip_count +FROM nyc_taxi.raw_trips AS t +LEFT JOIN nyc_taxi.raw_zones AS z + ON t.pickup_location_id = z.location_id +WHERE t.pickup_location_id IS NOT NULL + AND z.location_id IS NULL +GROUP BY t.pickup_location_id +ORDER BY orphaned_trip_count DESC; -- Do NOT use NOT IN: a single NULL in the subquery hides every orphan. diff --git a/verification_results.sql b/verification_results.sql index 68a8d26..fff5688 100644 --- a/verification_results.sql +++ b/verification_results.sql @@ -4,19 +4,92 @@ -- 1. Volume: how many total rows in vw_fact_trips? How many rows per borough? -- What is the most common pickup/dropoff location combination? --- TODO +SELECT + COUNT(*) AS total_fact_trip_rows +FROM vw_fact_trips; -- (Take a screenshot of the per-borough counts and save it as assets/borough_count.png.) +SELECT + d.borough, + COUNT(*) AS trip_count +FROM vw_fact_trips AS f +JOIN vw_dim_zones AS d + ON f.pickup_location_id = d.location_id +GROUP BY d.borough +ORDER BY trip_count DESC; + +SELECT + pickup_zone.zone AS pickup_zone, + dropoff_zone.zone AS dropoff_zone, + COUNT(*) AS trip_count +FROM vw_fact_trips AS f +JOIN vw_dim_zones AS pickup_zone + ON f.pickup_location_id = pickup_zone.location_id +JOIN vw_dim_zones AS dropoff_zone + ON f.dropoff_location_id = dropoff_zone.location_id +GROUP BY + pickup_zone.zone, + dropoff_zone.zone +ORDER BY trip_count DESC +LIMIT 1; -- 2. Revenue: which pickup zone (name, not ID) generated the highest total fare_amount? -- Which pickup zone collected the highest total fare_amount on any single day? --- TODO +SELECT + d.zone AS pickup_zone, + d.borough AS pickup_borough, + SUM(f.fare_amount) AS total_fare_amount +FROM vw_fact_trips AS f +JOIN vw_dim_zones AS d + ON f.pickup_location_id = d.location_id +GROUP BY + d.zone, + d.borough +ORDER BY total_fare_amount DESC +LIMIT 1; + +SELECT + DATE(f.pickup_datetime) AS pickup_date, + d.zone AS pickup_zone, + d.borough AS pickup_borough, + SUM(f.fare_amount) AS daily_total_fare_amount +FROM vw_fact_trips AS f +JOIN vw_dim_zones AS d + ON f.pickup_location_id = d.location_id +GROUP BY + DATE(f.pickup_datetime), + d.zone, + d.borough +ORDER BY daily_total_fare_amount DESC +LIMIT 1; -- 3. Geospatial: total number of trips and average trip_distance for each borough. --- TODO +SELECT + d.borough, + COUNT(*) AS trip_count, + AVG(f.trip_distance) AS avg_trip_distance +FROM vw_fact_trips AS f +JOIN vw_dim_zones AS d + ON f.pickup_location_id = d.location_id +GROUP BY d.borough +ORDER BY trip_count DESC; -- 4. Time patterns: which day of the week had the highest total tip_amount? -- What hour of the day has the highest average tip? --- TODO +SELECT + TO_CHAR(pickup_datetime, 'Day') AS day_of_week, + SUM(tip_amount) AS total_tip_amount +FROM vw_fact_trips +GROUP BY TO_CHAR(pickup_datetime, 'Day') +ORDER BY total_tip_amount DESC +LIMIT 1; + +SELECT + DATE_PART('hour', pickup_datetime) AS pickup_hour, + AVG(tip_amount) AS avg_tip_amount +FROM vw_fact_trips +GROUP BY DATE_PART('hour', pickup_datetime) +ORDER BY avg_tip_amount DESC +LIMIT 1; \ No newline at end of file