diff --git a/02_activities/assignments/assignment2.sql b/02_activities/assignments/assignment2.sql index 7dd4f5637..5ad40748a 100644 --- a/02_activities/assignments/assignment2.sql +++ b/02_activities/assignments/assignment2.sql @@ -20,11 +20,7 @@ The `||` values concatenate the columns into strings. Edit the appropriate columns -- you're making two edits -- and the NULL rows will be fixed. All the other rows will remain the same.) */ -SELECT - COALESCE(product_name, '') || ', ' || - COALESCE(product_size, '') || ' (' || - COALESCE(product_qty_type, 'unit') || ')' -FROM product; + --Windowed Functions /* 1. Write a query that selects from the customer_purchases table and numbers each customer’s @@ -36,53 +32,18 @@ each new market date for each customer, or select only the unique market dates p (without purchase details) and number those visits. HINT: One of these approaches uses ROW_NUMBER() and one uses DENSE_RANK(). */ -SELECT - customer_id, - market_date, - ROW_NUMBER() OVER ( - PARTITION BY customer_id - ORDER BY market_date - ) AS visit_number -FROM customer_purchases; + /* 2. Reverse the numbering of the query from a part so each customer’s most recent visit is labeled 1, then write another query that uses this one as a subquery (or temp table) and filters the results to only the customer’s most recent visit. */ -SELECT - customer_id, - market_date, - ROW_NUMBER() OVER ( - PARTITION BY customer_id - ORDER BY market_date DESC - ) AS reverse_visit_number -FROM customer_purchases; - - -SELECT * -FROM ( - SELECT - customer_id, - market_date, - ROW_NUMBER() OVER ( - PARTITION BY customer_id - ORDER BY market_date DESC - ) AS reverse_visit_number - FROM customer_purchases -) AS numbered_visits -WHERE reverse_visit_number = 1; + + /* 3. Using a COUNT() window function, include a value along with each row of the customer_purchases table that indicates how many different times that customer has purchased that product_id. */ -SELECT - customer_id, - product_id, - market_date, - quantity, - COUNT(*) OVER ( - PARTITION BY customer_id, product_id - ) AS customer_product_purchase_count -FROM customer_purchases; + -- String manipulations /* 1. Some product names in the product table have descriptions like "Jar" or "Organic". @@ -97,21 +58,10 @@ Remove any trailing or leading whitespaces. Don't just use a case statement for Hint: you might need to use INSTR(product_name,'-') to find the hyphens. INSTR will help split the column. */ -SELECT - product_name, - CASE - WHEN INSTR(product_name, '-') > 0 THEN - TRIM(SUBSTR(product_name, INSTR(product_name, '-') + 1)) - ELSE - NULL - END AS description -FROM product; /* 2. Filter the query to show any product_size value that contain a number with REGEXP. */ -SELECT * -FROM product -WHERE product_size REGEXP '[0-9]'; + -- UNION /* 1. Using a UNION, write a query that displays the market dates with the highest and lowest total sales. @@ -123,41 +73,7 @@ HINT: There are a possibly a few ways to do this query, but if you're struggling 3) Query the second temp table twice, once for the best day, once for the worst day, with a UNION binding them. */ --- Step 1: Calculate total sales per market date -WITH sales_by_date AS ( - SELECT - market_date, - SUM(quantity * cost_to_customer_per_qty) AS total_sales - FROM customer_purchases - GROUP BY market_date -), - --- Step 2: Rank the market dates by total sales (descending and ascending) -ranked_sales AS ( - SELECT - market_date, - total_sales, - RANK() OVER (ORDER BY total_sales DESC) AS best_rank, - RANK() OVER (ORDER BY total_sales ASC) AS worst_rank - FROM sales_by_date -) - --- Step 3: UNION results for best and worst days -SELECT - 'Highest Sales Day' AS label, - market_date, - total_sales -FROM ranked_sales -WHERE best_rank = 1 - -UNION -SELECT - 'Lowest Sales Day' AS label, - market_date, - total_sales -FROM ranked_sales -WHERE worst_rank = 1; /* SECTION 3 */ @@ -172,17 +88,7 @@ Remember, CROSS JOIN will explode your table rows, so CROSS JOIN should likely b Think a bit about the row counts: how many distinct vendors, product names are there (x)? How many customers are there (y). Before your final group by you should have the product of those two queries (x*y). */ -SELECT - v.vendor_name, - p.product_name, - SUM(5 * vi.cost_to_customer_per_qty) AS total_revenue -FROM vendor_inventory vi -JOIN vendor v ON vi.vendor_id = v.vendor_id -JOIN product p ON vi.product_id = p.product_id -CROSS JOIN ( - SELECT DISTINCT customer_id FROM customer -) AS customers -GROUP BY v.vendor_name, p.product_name; + -- INSERT @@ -190,46 +96,20 @@ GROUP BY v.vendor_name, p.product_name; This table will contain only products where the `product_qty_type = 'unit'`. It should use all of the columns from the product table, as well as a new column for the `CURRENT_TIMESTAMP`. Name the timestamp column `snapshot_timestamp`. */ -CREATE TABLE product_units AS -SELECT - *, - CURRENT_TIMESTAMP AS snapshot_timestamp -FROM product -WHERE product_qty_type = 'unit'; + /*2. Using `INSERT`, add a new row to the product_units table (with an updated timestamp). This can be any product you desire (e.g. add another record for Apple Pie). */ -INSERT INTO product_units ( - product_id, - product_name, - product_size, - product_qty_type, - product_category_id, - snapshot_timestamp -) -VALUES ( - 24, -- Use a unique ID not in use - 'Pumpkin Pie', - '1 each', - 'unit', - 3, -- Replace with a valid category ID as appropriate - CURRENT_TIMESTAMP -); + -- DELETE /* 1. Delete the older record for the whatever product you added. HINT: If you don't specify a WHERE clause, you are going to have a bad time.*/ -DELETE FROM product_units -WHERE product_id = 7 - AND snapshot_timestamp < ( - SELECT MAX(snapshot_timestamp) - FROM product_units - WHERE product_id = 7 -); + -- UPDATE /* 1.We want to add the current_quantity to the product_units table. @@ -248,20 +128,6 @@ Finally, make sure you have a WHERE statement to update the right row, you'll need to use product_units.product_id to refer to the correct row within the product_units table. When you have all of these components, you can run the update statement. */ -ALTER TABLE product_units -ADD COLUMN current_quantity INT; - -UPDATE product_units pu -SET current_quantity = COALESCE(( - SELECT vi.quantity - FROM vendor_inventory vi - WHERE vi.product_id = pu.product_id - AND vi.market_date = ( - SELECT MAX(market_date) - FROM vendor_inventory - WHERE product_id = pu.product_id - ) - LIMIT 1 -), 0); +