From 261592bd7ec6f2980130f5a0bbef229c8e1d143d Mon Sep 17 00:00:00 2001 From: hannahwn Date: Wed, 1 Jul 2026 17:38:04 +0200 Subject: [PATCH] completed week 9 assingment --- AI_ASSIST.md | 28 ++++++++++++++++++++++--- assets/borough_count.png | Bin 0 -> 60689 bytes data_dictionary.md | 16 +++++++-------- schema_setup.sql | 28 ++++++++++++++++++++----- validation_queries.sql | 23 +++++++++++++++++++++ verification_results.sql | 43 ++++++++++++++++++++++++++++++++++++++- 6 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 assets/borough_count.png diff --git a/AI_ASSIST.md b/AI_ASSIST.md index 07efd00..d13b580 100644 --- a/AI_ASSIST.md +++ b/AI_ASSIST.md @@ -6,16 +6,38 @@ 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. +My database was working but the next day it said connection is broken +Connection to hyf-data-pg.postgres.database.azure.com:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. + Connection refused: getsockopt ## The prompt -TODO: What did you ask the AI? Include the context you provided. +why is my connection to my database broken with error Connection refused: getsockopt ## The response -TODO: What did it suggest? Did it work first try? +refused: getsockopt + +"Connection refused: getsockopt" is a very common socket-level error. It means your client tried to open a TCP connection to the database but the target machine actively refused it (or nothing was listening).Most Common Causes (in order)Rank +Cause +Why it happens +1 +Database server is not running +Service crashed, wasn't started, or was stopped +2 +Wrong host/port +You're connecting to localhost:5432 but the DB is on another machine or different port +3 +DB only listening on localhost +Many DBs (especially Postgres, MySQL) by default bind to 127.0.0.1 only +4 +Firewall +iptables, ufw, firewalld, cloud security groups, etc. blocking the port + +IT DIDNT WORK ## Reflection TODO: Did you understand *why* the suggestion worked, or did you accept it blindly? + +i did not understand ,so i requested help and used a localhost postgres instead of the azure postgres diff --git a/assets/borough_count.png b/assets/borough_count.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d66aaa55146ed173cd4951ef302ddfe60f40a8 GIT binary patch literal 60689 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 +- **Primary key:** vendor_id +- **Foreign keys:** pickup_location_id, dropoff_location_id +- **Measures:** fare_amount,trip_distance,tip_amount,passenger_count ## vw_dim_zones -- **Grain:** TODO -- **Primary key:** TODO -- **Foreign keys:** TODO (or "none") -- **Measures:** TODO (or "none, descriptive attributes only") +- **Grain:** one zone per day +- **Primary key:** location id +- **Foreign keys:** ( "none") +- **Measures:** "none, descriptive attributes only" diff --git a/schema_setup.sql b/schema_setup.sql index a7ae1ad..560959a 100644 --- a/schema_setup.sql +++ b/schema_setup.sql @@ -5,8 +5,12 @@ -- TODO: complete the SELECT (location_id, zone, borough). CREATE OR REPLACE VIEW vw_dim_zones AS SELECT - -- TODO -FROM nyc_taxi.raw_zones; + rz.location_id, + rz.zone, + rz.borough +FROM nyc_taxi.raw_zones ; + +; -- Fact: one row per taxi trip. -- - Exclude rows where fare_amount is less than 0. @@ -15,12 +19,26 @@ FROM nyc_taxi.raw_zones; -- TODO: complete the SELECT and the WHERE. CREATE OR REPLACE VIEW vw_fact_trips AS SELECT - -- TODO + vendor_id, + pickup_datetime::timestamp AS pickup_datetime, + dropoff_datetime, + passenger_count, + pickup_location_id, + dropoff_location_id, + trip_distance, + fare_amount, + tip_amount, + payment_type FROM nyc_taxi.raw_trips --- TODO: WHERE fare_amount >= 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 * from vw_fact_trips f +join vw_dim_zones d on f.pickup_location_id = d.location_id; + + + diff --git a/validation_queries.sql b/validation_queries.sql index 301b194..75731cf 100644 --- a/validation_queries.sql +++ b/validation_queries.sql @@ -6,15 +6,38 @@ -- 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(*) AS total_rows, + 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 +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_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). -- Do NOT use NOT IN: a single NULL in the subquery hides every orphan. + +SELECT t.pickup_location_id +FROM nyc_taxi.raw_trips t +LEFT JOIN nyc_taxi.raw_zones z ON t.pickup_location_id = z.location_id +WHERE z.location_id IS NULL diff --git a/verification_results.sql b/verification_results.sql index 68a8d26..6ac4e3e 100644 --- a/verification_results.sql +++ b/verification_results.sql @@ -3,20 +3,61 @@ -- Borough and zone names live in vw_dim_zones, so join on pickup_location_id = location_id. -- 1. Volume: how many total rows in vw_fact_trips? How many rows per borough? + +SELECT COUNT(*) AS total_rows FROM vw_fact_trips; + + -- What is the most common pickup/dropoff location combination? + +Select d.borough, COUNT(*) AS rows_per_borough +from vw_fact_trips f +join vw_dim_zones d on f.pickup_location_id = d.location_id +group by d.borough +order by rows_per_borough desc; + + -- TODO -- (Take a screenshot of the per-borough counts and save it as assets/borough_count.png.) + -- 2. Revenue: which pickup zone (name, not ID) generated the highest total fare_amount? + +SELECT d.zone, SUM(f.fare_amount) AS total_fare +FROM vw_fact_trips f +JOIN vw_dim_zones d ON f.pickup_location_id = d.location_id +GROUP BY d.zone +ORDER BY total_fare DESC +LIMIT 1; -- Which pickup zone collected the highest total fare_amount on any single day? -- TODO +SELECT d.zone, f.pickup_datetime::date AS pickup_date, SUM(f.fare_amount) AS total_fare +FROM vw_fact_trips f +JOIN vw_dim_zones d ON f.pickup_location_id = d.location_id +GROUP BY d.zone, pickup_date +ORDER BY total_fare DESC +LIMIT 1; -- 3. Geospatial: total number of trips and average trip_distance for each borough. -- TODO - +SELECT d.borough, COUNT(*) AS total_trips, AVG(f.trip_distance) AS avg_trip_distance +FROM vw_fact_trips f +JOIN vw_dim_zones d ON f.pickup_location_id = d.location_id +GROUP BY d.borough +ORDER BY total_trips DESC; -- 4. Time patterns: which day of the week had the highest total tip_amount? + +SELECT EXTRACT(DOW FROM f.pickup_datetime) AS day_of_week, SUM(f.tip_amount) AS total_tip +FROM vw_fact_trips f +GROUP BY day_of_week +ORDER BY total_tip DESC +LIMIT 1; -- What hour of the day has the highest average tip? -- TODO +SELECT EXTRACT(HOUR FROM f.pickup_datetime) AS hour_of_day, AVG(f.tip_amount) AS avg_tip +FROM vw_fact_trips f +GROUP BY hour_of_day +ORDER BY avg_tip DESC +LIMIT 1;