Queer European MD passionate about IT
Pārlūkot izejas kodu

Merge pull request #183 from dataquestio/anna-strahl-window-functions-GP-solution

Create Mission777Solutions.ipynb
acstrahl 1 gadu atpakaļ
vecāks
revīzija
4eb7e45567
1 mainītis faili ar 2017 papildinājumiem un 0 dzēšanām
  1. 2017 0
      Mission777Solutions.ipynb

+ 2017 - 0
Mission777Solutions.ipynb

@@ -0,0 +1,2017 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "e74edf74",
+   "metadata": {},
+   "source": [
+    "# Window Functions in Action: SQL Analytics for Northwind Traders"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "7a798832",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The sql extension is already loaded. To reload it, use:\n",
+      "  %reload_ext sql\n"
+     ]
+    }
+   ],
+   "source": [
+    "%load_ext sql\n",
+    "\n",
+    "connection_string = f'postgresql://postgres:{password}@localhost:5432/northwind'\n",
+    "\n",
+    "%sql $connection_string"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "168208d2",
+   "metadata": {},
+   "source": [
+    "####  Exploring the Northwind Database - Getting to Know the Data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "20cb9a01",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "14 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>name</th>\n",
+       "            <th>type</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>territories</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>order_details</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>employee_territories</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>us_states</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>customers</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>orders</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>employees</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>shippers</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>products</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>categories</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>suppliers</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>region</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>customer_demographics</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>customer_customer_demo</td>\n",
+       "            <td>BASE TABLE</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('territories', 'BASE TABLE'),\n",
+       " ('order_details', 'BASE TABLE'),\n",
+       " ('employee_territories', 'BASE TABLE'),\n",
+       " ('us_states', 'BASE TABLE'),\n",
+       " ('customers', 'BASE TABLE'),\n",
+       " ('orders', 'BASE TABLE'),\n",
+       " ('employees', 'BASE TABLE'),\n",
+       " ('shippers', 'BASE TABLE'),\n",
+       " ('products', 'BASE TABLE'),\n",
+       " ('categories', 'BASE TABLE'),\n",
+       " ('suppliers', 'BASE TABLE'),\n",
+       " ('region', 'BASE TABLE'),\n",
+       " ('customer_demographics', 'BASE TABLE'),\n",
+       " ('customer_customer_demo', 'BASE TABLE')]"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT\n",
+    "    table_name as name,\n",
+    "    table_type as type\n",
+    "FROM information_schema.tables\n",
+    "WHERE table_schema = 'public' AND table_type IN ('BASE TABLE', 'VIEW');\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "11a35d51",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "5 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>customer_id</th>\n",
+       "            <th>company_name</th>\n",
+       "            <th>contact_name</th>\n",
+       "            <th>contact_title</th>\n",
+       "            <th>address</th>\n",
+       "            <th>city</th>\n",
+       "            <th>region</th>\n",
+       "            <th>postal_code</th>\n",
+       "            <th>country</th>\n",
+       "            <th>phone</th>\n",
+       "            <th>fax</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>ALFKI</td>\n",
+       "            <td>Alfreds Futterkiste</td>\n",
+       "            <td>Maria Anders</td>\n",
+       "            <td>Sales Representative</td>\n",
+       "            <td>Obere Str. 57</td>\n",
+       "            <td>Berlin</td>\n",
+       "            <td>None</td>\n",
+       "            <td>12209</td>\n",
+       "            <td>Germany</td>\n",
+       "            <td>030-0074321</td>\n",
+       "            <td>030-0076545</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>ANATR</td>\n",
+       "            <td>Ana Trujillo Emparedados y helados</td>\n",
+       "            <td>Ana Trujillo</td>\n",
+       "            <td>Owner</td>\n",
+       "            <td>Avda. de la Constitución 2222</td>\n",
+       "            <td>México D.F.</td>\n",
+       "            <td>None</td>\n",
+       "            <td>05021</td>\n",
+       "            <td>Mexico</td>\n",
+       "            <td>(5) 555-4729</td>\n",
+       "            <td>(5) 555-3745</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>ANTON</td>\n",
+       "            <td>Antonio Moreno Taquería</td>\n",
+       "            <td>Antonio Moreno</td>\n",
+       "            <td>Owner</td>\n",
+       "            <td>Mataderos  2312</td>\n",
+       "            <td>México D.F.</td>\n",
+       "            <td>None</td>\n",
+       "            <td>05023</td>\n",
+       "            <td>Mexico</td>\n",
+       "            <td>(5) 555-3932</td>\n",
+       "            <td>None</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>AROUT</td>\n",
+       "            <td>Around the Horn</td>\n",
+       "            <td>Thomas Hardy</td>\n",
+       "            <td>Sales Representative</td>\n",
+       "            <td>120 Hanover Sq.</td>\n",
+       "            <td>London</td>\n",
+       "            <td>None</td>\n",
+       "            <td>WA1 1DP</td>\n",
+       "            <td>UK</td>\n",
+       "            <td>(171) 555-7788</td>\n",
+       "            <td>(171) 555-6750</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>BERGS</td>\n",
+       "            <td>Berglunds snabbköp</td>\n",
+       "            <td>Christina Berglund</td>\n",
+       "            <td>Order Administrator</td>\n",
+       "            <td>Berguvsvägen  8</td>\n",
+       "            <td>Luleå</td>\n",
+       "            <td>None</td>\n",
+       "            <td>S-958 22</td>\n",
+       "            <td>Sweden</td>\n",
+       "            <td>0921-12 34 65</td>\n",
+       "            <td>0921-12 34 67</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('ALFKI', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', None, '12209', 'Germany', '030-0074321', '030-0076545'),\n",
+       " ('ANATR', 'Ana Trujillo Emparedados y helados', 'Ana Trujillo', 'Owner', 'Avda. de la Constitución 2222', 'México D.F.', None, '05021', 'Mexico', '(5) 555-4729', '(5) 555-3745'),\n",
+       " ('ANTON', 'Antonio Moreno Taquería', 'Antonio Moreno', 'Owner', 'Mataderos  2312', 'México D.F.', None, '05023', 'Mexico', '(5) 555-3932', None),\n",
+       " ('AROUT', 'Around the Horn', 'Thomas Hardy', 'Sales Representative', '120 Hanover Sq.', 'London', None, 'WA1 1DP', 'UK', '(171) 555-7788', '(171) 555-6750'),\n",
+       " ('BERGS', 'Berglunds snabbköp', 'Christina Berglund', 'Order Administrator', 'Berguvsvägen  8', 'Luleå', None, 'S-958 22', 'Sweden', '0921-12 34 65', '0921-12 34 67')]"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT *\n",
+    "FROM customers\n",
+    "LIMIT 5;"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "f1d842bf",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "5 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>order_id</th>\n",
+       "            <th>customer_id</th>\n",
+       "            <th>employee_id</th>\n",
+       "            <th>order_date</th>\n",
+       "            <th>required_date</th>\n",
+       "            <th>shipped_date</th>\n",
+       "            <th>ship_via</th>\n",
+       "            <th>freight</th>\n",
+       "            <th>ship_name</th>\n",
+       "            <th>ship_address</th>\n",
+       "            <th>ship_city</th>\n",
+       "            <th>ship_region</th>\n",
+       "            <th>ship_postal_code</th>\n",
+       "            <th>ship_country</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>VINET</td>\n",
+       "            <td>5</td>\n",
+       "            <td>1996-07-04</td>\n",
+       "            <td>1996-08-01</td>\n",
+       "            <td>1996-07-16</td>\n",
+       "            <td>3</td>\n",
+       "            <td>32.38</td>\n",
+       "            <td>Vins et alcools Chevalier</td>\n",
+       "            <td>59 rue de l&#x27;Abbaye</td>\n",
+       "            <td>Reims</td>\n",
+       "            <td>None</td>\n",
+       "            <td>51100</td>\n",
+       "            <td>France</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10249</td>\n",
+       "            <td>TOMSP</td>\n",
+       "            <td>6</td>\n",
+       "            <td>1996-07-05</td>\n",
+       "            <td>1996-08-16</td>\n",
+       "            <td>1996-07-10</td>\n",
+       "            <td>1</td>\n",
+       "            <td>11.61</td>\n",
+       "            <td>Toms Spezialitäten</td>\n",
+       "            <td>Luisenstr. 48</td>\n",
+       "            <td>Münster</td>\n",
+       "            <td>None</td>\n",
+       "            <td>44087</td>\n",
+       "            <td>Germany</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10250</td>\n",
+       "            <td>HANAR</td>\n",
+       "            <td>4</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "            <td>1996-08-05</td>\n",
+       "            <td>1996-07-12</td>\n",
+       "            <td>2</td>\n",
+       "            <td>65.83</td>\n",
+       "            <td>Hanari Carnes</td>\n",
+       "            <td>Rua do Paço, 67</td>\n",
+       "            <td>Rio de Janeiro</td>\n",
+       "            <td>RJ</td>\n",
+       "            <td>05454-876</td>\n",
+       "            <td>Brazil</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10251</td>\n",
+       "            <td>VICTE</td>\n",
+       "            <td>3</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "            <td>1996-08-05</td>\n",
+       "            <td>1996-07-15</td>\n",
+       "            <td>1</td>\n",
+       "            <td>41.34</td>\n",
+       "            <td>Victuailles en stock</td>\n",
+       "            <td>2, rue du Commerce</td>\n",
+       "            <td>Lyon</td>\n",
+       "            <td>None</td>\n",
+       "            <td>69004</td>\n",
+       "            <td>France</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10252</td>\n",
+       "            <td>SUPRD</td>\n",
+       "            <td>4</td>\n",
+       "            <td>1996-07-09</td>\n",
+       "            <td>1996-08-06</td>\n",
+       "            <td>1996-07-11</td>\n",
+       "            <td>2</td>\n",
+       "            <td>51.3</td>\n",
+       "            <td>Suprêmes délices</td>\n",
+       "            <td>Boulevard Tirou, 255</td>\n",
+       "            <td>Charleroi</td>\n",
+       "            <td>None</td>\n",
+       "            <td>B-6000</td>\n",
+       "            <td>Belgium</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(10248, 'VINET', 5, datetime.date(1996, 7, 4), datetime.date(1996, 8, 1), datetime.date(1996, 7, 16), 3, 32.38, 'Vins et alcools Chevalier', \"59 rue de l'Abbaye\", 'Reims', None, '51100', 'France'),\n",
+       " (10249, 'TOMSP', 6, datetime.date(1996, 7, 5), datetime.date(1996, 8, 16), datetime.date(1996, 7, 10), 1, 11.61, 'Toms Spezialitäten', 'Luisenstr. 48', 'Münster', None, '44087', 'Germany'),\n",
+       " (10250, 'HANAR', 4, datetime.date(1996, 7, 8), datetime.date(1996, 8, 5), datetime.date(1996, 7, 12), 2, 65.83, 'Hanari Carnes', 'Rua do Paço, 67', 'Rio de Janeiro', 'RJ', '05454-876', 'Brazil'),\n",
+       " (10251, 'VICTE', 3, datetime.date(1996, 7, 8), datetime.date(1996, 8, 5), datetime.date(1996, 7, 15), 1, 41.34, 'Victuailles en stock', '2, rue du Commerce', 'Lyon', None, '69004', 'France'),\n",
+       " (10252, 'SUPRD', 4, datetime.date(1996, 7, 9), datetime.date(1996, 8, 6), datetime.date(1996, 7, 11), 2, 51.3, 'Suprêmes délices', 'Boulevard Tirou, 255', 'Charleroi', None, 'B-6000', 'Belgium')]"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT *\n",
+    "FROM orders\n",
+    "LIMIT 5;"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "47c21508",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "5 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>order_id</th>\n",
+       "            <th>product_id</th>\n",
+       "            <th>unit_price</th>\n",
+       "            <th>quantity</th>\n",
+       "            <th>discount</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>11</td>\n",
+       "            <td>14.0</td>\n",
+       "            <td>12</td>\n",
+       "            <td>0.0</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>42</td>\n",
+       "            <td>9.8</td>\n",
+       "            <td>10</td>\n",
+       "            <td>0.0</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>72</td>\n",
+       "            <td>34.8</td>\n",
+       "            <td>5</td>\n",
+       "            <td>0.0</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10249</td>\n",
+       "            <td>14</td>\n",
+       "            <td>18.6</td>\n",
+       "            <td>9</td>\n",
+       "            <td>0.0</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10249</td>\n",
+       "            <td>51</td>\n",
+       "            <td>42.4</td>\n",
+       "            <td>40</td>\n",
+       "            <td>0.0</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(10248, 11, 14.0, 12, 0.0),\n",
+       " (10248, 42, 9.8, 10, 0.0),\n",
+       " (10248, 72, 34.8, 5, 0.0),\n",
+       " (10249, 14, 18.6, 9, 0.0),\n",
+       " (10249, 51, 42.4, 40, 0.0)]"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT *\n",
+    "FROM order_details\n",
+    "LIMIT 5;"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "4c4afb57",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "5 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>product_id</th>\n",
+       "            <th>product_name</th>\n",
+       "            <th>supplier_id</th>\n",
+       "            <th>category_id</th>\n",
+       "            <th>quantity_per_unit</th>\n",
+       "            <th>unit_price</th>\n",
+       "            <th>units_in_stock</th>\n",
+       "            <th>units_on_order</th>\n",
+       "            <th>reorder_level</th>\n",
+       "            <th>discontinued</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>1</td>\n",
+       "            <td>Chai</td>\n",
+       "            <td>8</td>\n",
+       "            <td>1</td>\n",
+       "            <td>10 boxes x 30 bags</td>\n",
+       "            <td>18.0</td>\n",
+       "            <td>39</td>\n",
+       "            <td>0</td>\n",
+       "            <td>10</td>\n",
+       "            <td>1</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>2</td>\n",
+       "            <td>Chang</td>\n",
+       "            <td>1</td>\n",
+       "            <td>1</td>\n",
+       "            <td>24 - 12 oz bottles</td>\n",
+       "            <td>19.0</td>\n",
+       "            <td>17</td>\n",
+       "            <td>40</td>\n",
+       "            <td>25</td>\n",
+       "            <td>1</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>3</td>\n",
+       "            <td>Aniseed Syrup</td>\n",
+       "            <td>1</td>\n",
+       "            <td>2</td>\n",
+       "            <td>12 - 550 ml bottles</td>\n",
+       "            <td>10.0</td>\n",
+       "            <td>13</td>\n",
+       "            <td>70</td>\n",
+       "            <td>25</td>\n",
+       "            <td>0</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>4</td>\n",
+       "            <td>Chef Anton&#x27;s Cajun Seasoning</td>\n",
+       "            <td>2</td>\n",
+       "            <td>2</td>\n",
+       "            <td>48 - 6 oz jars</td>\n",
+       "            <td>22.0</td>\n",
+       "            <td>53</td>\n",
+       "            <td>0</td>\n",
+       "            <td>0</td>\n",
+       "            <td>0</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>5</td>\n",
+       "            <td>Chef Anton&#x27;s Gumbo Mix</td>\n",
+       "            <td>2</td>\n",
+       "            <td>2</td>\n",
+       "            <td>36 boxes</td>\n",
+       "            <td>21.35</td>\n",
+       "            <td>0</td>\n",
+       "            <td>0</td>\n",
+       "            <td>0</td>\n",
+       "            <td>1</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, 'Chai', 8, 1, '10 boxes x 30 bags', 18.0, 39, 0, 10, 1),\n",
+       " (2, 'Chang', 1, 1, '24 - 12 oz bottles', 19.0, 17, 40, 25, 1),\n",
+       " (3, 'Aniseed Syrup', 1, 2, '12 - 550 ml bottles', 10.0, 13, 70, 25, 0),\n",
+       " (4, \"Chef Anton's Cajun Seasoning\", 2, 2, '48 - 6 oz jars', 22.0, 53, 0, 0, 0),\n",
+       " (5, \"Chef Anton's Gumbo Mix\", 2, 2, '36 boxes', 21.35, 0, 0, 0, 1)]"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT *\n",
+    "FROM products\n",
+    "LIMIT 5;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "83ace3dc",
+   "metadata": {},
+   "source": [
+    "Combine `orders` and `employees` tables to see who is responsible for each order:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "2e6d4d90",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>employee_name</th>\n",
+       "            <th>order_id</th>\n",
+       "            <th>order_date</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>Steven Buchanan</td>\n",
+       "            <td>10248</td>\n",
+       "            <td>1996-07-04</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Michael Suyama</td>\n",
+       "            <td>10249</td>\n",
+       "            <td>1996-07-05</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Margaret Peacock</td>\n",
+       "            <td>10250</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Janet Leverling</td>\n",
+       "            <td>10251</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Margaret Peacock</td>\n",
+       "            <td>10252</td>\n",
+       "            <td>1996-07-09</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Janet Leverling</td>\n",
+       "            <td>10253</td>\n",
+       "            <td>1996-07-10</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Steven Buchanan</td>\n",
+       "            <td>10254</td>\n",
+       "            <td>1996-07-11</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Anne Dodsworth</td>\n",
+       "            <td>10255</td>\n",
+       "            <td>1996-07-12</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Janet Leverling</td>\n",
+       "            <td>10256</td>\n",
+       "            <td>1996-07-15</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>Margaret Peacock</td>\n",
+       "            <td>10257</td>\n",
+       "            <td>1996-07-16</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('Steven Buchanan', 10248, datetime.date(1996, 7, 4)),\n",
+       " ('Michael Suyama', 10249, datetime.date(1996, 7, 5)),\n",
+       " ('Margaret Peacock', 10250, datetime.date(1996, 7, 8)),\n",
+       " ('Janet Leverling', 10251, datetime.date(1996, 7, 8)),\n",
+       " ('Margaret Peacock', 10252, datetime.date(1996, 7, 9)),\n",
+       " ('Janet Leverling', 10253, datetime.date(1996, 7, 10)),\n",
+       " ('Steven Buchanan', 10254, datetime.date(1996, 7, 11)),\n",
+       " ('Anne Dodsworth', 10255, datetime.date(1996, 7, 12)),\n",
+       " ('Janet Leverling', 10256, datetime.date(1996, 7, 15)),\n",
+       " ('Margaret Peacock', 10257, datetime.date(1996, 7, 16))]"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT \n",
+    "    e.first_name || ' ' || e.last_name as employee_name,\n",
+    "    o.order_id,\n",
+    "    o.order_date\n",
+    "FROM orders o\n",
+    "JOIN employees e ON o.employee_id = e.employee_id\n",
+    "LIMIT 10;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "66c9f902",
+   "metadata": {},
+   "source": [
+    "Combine `orders` and `customers` tables to get more detailed information about each customer:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "5b73e928",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>order_id</th>\n",
+       "            <th>company_name</th>\n",
+       "            <th>contact_name</th>\n",
+       "            <th>order_date</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>Vins et alcools Chevalier</td>\n",
+       "            <td>Paul Henriot</td>\n",
+       "            <td>1996-07-04</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10249</td>\n",
+       "            <td>Toms Spezialitäten</td>\n",
+       "            <td>Karin Josephs</td>\n",
+       "            <td>1996-07-05</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10250</td>\n",
+       "            <td>Hanari Carnes</td>\n",
+       "            <td>Mario Pontes</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10251</td>\n",
+       "            <td>Victuailles en stock</td>\n",
+       "            <td>Mary Saveley</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10252</td>\n",
+       "            <td>Suprêmes délices</td>\n",
+       "            <td>Pascale Cartrain</td>\n",
+       "            <td>1996-07-09</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10253</td>\n",
+       "            <td>Hanari Carnes</td>\n",
+       "            <td>Mario Pontes</td>\n",
+       "            <td>1996-07-10</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10254</td>\n",
+       "            <td>Chop-suey Chinese</td>\n",
+       "            <td>Yang Wang</td>\n",
+       "            <td>1996-07-11</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10255</td>\n",
+       "            <td>Richter Supermarkt</td>\n",
+       "            <td>Michael Holz</td>\n",
+       "            <td>1996-07-12</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10256</td>\n",
+       "            <td>Wellington Importadora</td>\n",
+       "            <td>Paula Parente</td>\n",
+       "            <td>1996-07-15</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10257</td>\n",
+       "            <td>HILARION-Abastos</td>\n",
+       "            <td>Carlos Hernández</td>\n",
+       "            <td>1996-07-16</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(10248, 'Vins et alcools Chevalier', 'Paul Henriot', datetime.date(1996, 7, 4)),\n",
+       " (10249, 'Toms Spezialitäten', 'Karin Josephs', datetime.date(1996, 7, 5)),\n",
+       " (10250, 'Hanari Carnes', 'Mario Pontes', datetime.date(1996, 7, 8)),\n",
+       " (10251, 'Victuailles en stock', 'Mary Saveley', datetime.date(1996, 7, 8)),\n",
+       " (10252, 'Suprêmes délices', 'Pascale Cartrain', datetime.date(1996, 7, 9)),\n",
+       " (10253, 'Hanari Carnes', 'Mario Pontes', datetime.date(1996, 7, 10)),\n",
+       " (10254, 'Chop-suey Chinese', 'Yang Wang', datetime.date(1996, 7, 11)),\n",
+       " (10255, 'Richter Supermarkt', 'Michael Holz', datetime.date(1996, 7, 12)),\n",
+       " (10256, 'Wellington Importadora', 'Paula Parente', datetime.date(1996, 7, 15)),\n",
+       " (10257, 'HILARION-Abastos', 'Carlos Hernández', datetime.date(1996, 7, 16))]"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT \n",
+    "    o.order_id,\n",
+    "    c.company_name,\n",
+    "    c.contact_name,\n",
+    "    o.order_date\n",
+    "FROM orders o\n",
+    "JOIN customers c ON o.customer_id = c.customer_id\n",
+    "LIMIT 10;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "65dc2089",
+   "metadata": {},
+   "source": [
+    "Combine `order_details`, `products`, and `orders` to get detailed order information including the product name and quantity:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "eae620d2",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>order_id</th>\n",
+       "            <th>product_name</th>\n",
+       "            <th>quantity</th>\n",
+       "            <th>order_date</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>Queso Cabrales</td>\n",
+       "            <td>12</td>\n",
+       "            <td>1996-07-04</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>Singaporean Hokkien Fried Mee</td>\n",
+       "            <td>10</td>\n",
+       "            <td>1996-07-04</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10248</td>\n",
+       "            <td>Mozzarella di Giovanni</td>\n",
+       "            <td>5</td>\n",
+       "            <td>1996-07-04</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10249</td>\n",
+       "            <td>Tofu</td>\n",
+       "            <td>9</td>\n",
+       "            <td>1996-07-05</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10249</td>\n",
+       "            <td>Manjimup Dried Apples</td>\n",
+       "            <td>40</td>\n",
+       "            <td>1996-07-05</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10250</td>\n",
+       "            <td>Jack&#x27;s New England Clam Chowder</td>\n",
+       "            <td>10</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10250</td>\n",
+       "            <td>Manjimup Dried Apples</td>\n",
+       "            <td>35</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10250</td>\n",
+       "            <td>Louisiana Fiery Hot Pepper Sauce</td>\n",
+       "            <td>15</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10251</td>\n",
+       "            <td>Gustaf&#x27;s Knäckebröd</td>\n",
+       "            <td>6</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>10251</td>\n",
+       "            <td>Ravioli Angelo</td>\n",
+       "            <td>15</td>\n",
+       "            <td>1996-07-08</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(10248, 'Queso Cabrales', 12, datetime.date(1996, 7, 4)),\n",
+       " (10248, 'Singaporean Hokkien Fried Mee', 10, datetime.date(1996, 7, 4)),\n",
+       " (10248, 'Mozzarella di Giovanni', 5, datetime.date(1996, 7, 4)),\n",
+       " (10249, 'Tofu', 9, datetime.date(1996, 7, 5)),\n",
+       " (10249, 'Manjimup Dried Apples', 40, datetime.date(1996, 7, 5)),\n",
+       " (10250, \"Jack's New England Clam Chowder\", 10, datetime.date(1996, 7, 8)),\n",
+       " (10250, 'Manjimup Dried Apples', 35, datetime.date(1996, 7, 8)),\n",
+       " (10250, 'Louisiana Fiery Hot Pepper Sauce', 15, datetime.date(1996, 7, 8)),\n",
+       " (10251, \"Gustaf's Knäckebröd\", 6, datetime.date(1996, 7, 8)),\n",
+       " (10251, 'Ravioli Angelo', 15, datetime.date(1996, 7, 8))]"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT \n",
+    "    o.order_id,\n",
+    "    p.product_name,\n",
+    "    od.quantity,\n",
+    "    o.order_date\n",
+    "FROM order_details od\n",
+    "JOIN products p ON od.product_id = p.product_id\n",
+    "JOIN orders o ON od.order_id = o.order_id\n",
+    "LIMIT 10;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ae99ad83-81c2-40e3-bff9-0a549cc2307b",
+   "metadata": {},
+   "source": [
+    "#### Rank employees by sales performance"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "dadbbfb8-7d11-4c4b-88d6-0bd5bf32c2cc",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "9 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>employee_id</th>\n",
+       "            <th>first_name</th>\n",
+       "            <th>last_name</th>\n",
+       "            <th>Sales Rank</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>4</td>\n",
+       "            <td>Margaret</td>\n",
+       "            <td>Peacock</td>\n",
+       "            <td>1</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>3</td>\n",
+       "            <td>Janet</td>\n",
+       "            <td>Leverling</td>\n",
+       "            <td>2</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1</td>\n",
+       "            <td>Nancy</td>\n",
+       "            <td>Davolio</td>\n",
+       "            <td>3</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>2</td>\n",
+       "            <td>Andrew</td>\n",
+       "            <td>Fuller</td>\n",
+       "            <td>4</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>8</td>\n",
+       "            <td>Laura</td>\n",
+       "            <td>Callahan</td>\n",
+       "            <td>5</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>7</td>\n",
+       "            <td>Robert</td>\n",
+       "            <td>King</td>\n",
+       "            <td>6</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>9</td>\n",
+       "            <td>Anne</td>\n",
+       "            <td>Dodsworth</td>\n",
+       "            <td>7</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>6</td>\n",
+       "            <td>Michael</td>\n",
+       "            <td>Suyama</td>\n",
+       "            <td>8</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>5</td>\n",
+       "            <td>Steven</td>\n",
+       "            <td>Buchanan</td>\n",
+       "            <td>9</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(4, 'Margaret', 'Peacock', 1),\n",
+       " (3, 'Janet', 'Leverling', 2),\n",
+       " (1, 'Nancy', 'Davolio', 3),\n",
+       " (2, 'Andrew', 'Fuller', 4),\n",
+       " (8, 'Laura', 'Callahan', 5),\n",
+       " (7, 'Robert', 'King', 6),\n",
+       " (9, 'Anne', 'Dodsworth', 7),\n",
+       " (6, 'Michael', 'Suyama', 8),\n",
+       " (5, 'Steven', 'Buchanan', 9)]"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "WITH EmployeeSales AS (\n",
+    "    SELECT Employees.Employee_ID, Employees.First_Name, Employees.Last_Name,\n",
+    "           SUM(Unit_Price * Quantity * (1 - Discount)) AS \"Total Sales\"\n",
+    "    FROM Orders \n",
+    "    JOIN Order_Details ON Orders.Order_ID = Order_Details.Order_ID\n",
+    "    JOIN Employees ON Orders.Employee_ID = Employees.Employee_ID\n",
+    "\n",
+    "    GROUP BY Employees.Employee_ID\n",
+    ")\n",
+    "SELECT Employee_ID, First_Name, Last_Name,\n",
+    "       RANK() OVER (ORDER BY \"Total Sales\" DESC) AS \"Sales Rank\"\n",
+    "FROM EmployeeSales;\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6db4f6ea",
+   "metadata": {},
+   "source": [
+    "We can see that Margeret Peacock is the top-selling employee and Steven Buchanan is the lowest-selling employee."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "edbf8c56-2cc9-434a-a992-bbae92d3858f",
+   "metadata": {},
+   "source": [
+    "#### Calculate running total of sales per month"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "8e9e175e-f00a-45ef-8829-c6b9d50422e3",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "23 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>Month</th>\n",
+       "            <th>Running Total</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>1996-07-01</td>\n",
+       "            <td>27861.89512966156</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996-08-01</td>\n",
+       "            <td>53347.17020040483</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996-09-01</td>\n",
+       "            <td>79728.57033299239</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996-10-01</td>\n",
+       "            <td>117244.29527847127</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996-11-01</td>\n",
+       "            <td>162844.3404896083</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996-12-01</td>\n",
+       "            <td>208083.97098282274</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-01-01</td>\n",
+       "            <td>269342.0411508011</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-02-01</td>\n",
+       "            <td>307825.6761011254</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-03-01</td>\n",
+       "            <td>346372.8962108522</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-04-01</td>\n",
+       "            <td>399405.8485997937</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-05-01</td>\n",
+       "            <td>453187.13842493534</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-06-01</td>\n",
+       "            <td>489549.9407597378</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-07-01</td>\n",
+       "            <td>540570.7982783426</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-08-01</td>\n",
+       "            <td>587858.4679665978</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-09-01</td>\n",
+       "            <td>643487.7103683471</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-10-01</td>\n",
+       "            <td>710236.9361440743</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-11-01</td>\n",
+       "            <td>753770.7449116395</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997-12-01</td>\n",
+       "            <td>825169.1733755233</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998-01-01</td>\n",
+       "            <td>919391.2835824591</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998-02-01</td>\n",
+       "            <td>1018806.5709654673</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998-03-01</td>\n",
+       "            <td>1123660.7259656242</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998-04-01</td>\n",
+       "            <td>1247459.4082211715</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998-05-01</td>\n",
+       "            <td>1265793.0386533642</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(datetime.date(1996, 7, 1), 27861.89512966156),\n",
+       " (datetime.date(1996, 8, 1), 53347.17020040483),\n",
+       " (datetime.date(1996, 9, 1), 79728.57033299239),\n",
+       " (datetime.date(1996, 10, 1), 117244.29527847127),\n",
+       " (datetime.date(1996, 11, 1), 162844.3404896083),\n",
+       " (datetime.date(1996, 12, 1), 208083.97098282274),\n",
+       " (datetime.date(1997, 1, 1), 269342.0411508011),\n",
+       " (datetime.date(1997, 2, 1), 307825.6761011254),\n",
+       " (datetime.date(1997, 3, 1), 346372.8962108522),\n",
+       " (datetime.date(1997, 4, 1), 399405.8485997937),\n",
+       " (datetime.date(1997, 5, 1), 453187.13842493534),\n",
+       " (datetime.date(1997, 6, 1), 489549.9407597378),\n",
+       " (datetime.date(1997, 7, 1), 540570.7982783426),\n",
+       " (datetime.date(1997, 8, 1), 587858.4679665978),\n",
+       " (datetime.date(1997, 9, 1), 643487.7103683471),\n",
+       " (datetime.date(1997, 10, 1), 710236.9361440743),\n",
+       " (datetime.date(1997, 11, 1), 753770.7449116395),\n",
+       " (datetime.date(1997, 12, 1), 825169.1733755233),\n",
+       " (datetime.date(1998, 1, 1), 919391.2835824591),\n",
+       " (datetime.date(1998, 2, 1), 1018806.5709654673),\n",
+       " (datetime.date(1998, 3, 1), 1123660.7259656242),\n",
+       " (datetime.date(1998, 4, 1), 1247459.4082211715),\n",
+       " (datetime.date(1998, 5, 1), 1265793.0386533642)]"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "-- Exe 1\n",
+    "WITH MonthlySales AS (\n",
+    "    SELECT DATE_TRUNC('month', Order_Date)::DATE AS \"Month\", \n",
+    "           SUM(Unit_Price * Quantity * (1 - Discount)) AS \"Total Sales\"\n",
+    "    FROM Orders \n",
+    "    JOIN Order_Details ON Orders.Order_ID = Order_Details.Order_ID\n",
+    "    GROUP BY DATE_TRUNC('month', Order_Date)\n",
+    ")\n",
+    "SELECT \"Month\", \n",
+    "       SUM(\"Total Sales\") OVER (ORDER BY \"Month\") AS \"Running Total\"\n",
+    "FROM MonthlySales\n",
+    "ORDER BY \"Month\";"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d5166f84-40eb-4b26-ab40-c902b3612c1a",
+   "metadata": {},
+   "source": [
+    "#### Calculate the month-over-month sales growth rate"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "id": "8c0c051c-7e44-4746-8a6d-8c2d73a624f3",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "23 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>year</th>\n",
+       "            <th>month</th>\n",
+       "            <th>Growth Rate</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>1996</td>\n",
+       "            <td>7</td>\n",
+       "            <td>None</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996</td>\n",
+       "            <td>8</td>\n",
+       "            <td>-8.530001451294545</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996</td>\n",
+       "            <td>9</td>\n",
+       "            <td>3.51624637896504</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996</td>\n",
+       "            <td>10</td>\n",
+       "            <td>42.20520805162909</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996</td>\n",
+       "            <td>11</td>\n",
+       "            <td>21.54915112904513</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1996</td>\n",
+       "            <td>12</td>\n",
+       "            <td>-0.7903823696967553</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>1</td>\n",
+       "            <td>35.40798079057388</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>2</td>\n",
+       "            <td>-37.17785290199861</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>3</td>\n",
+       "            <td>0.16522649038887202</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>4</td>\n",
+       "            <td>37.579187910257275</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>5</td>\n",
+       "            <td>1.4110800973551207</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>6</td>\n",
+       "            <td>-32.38763433709323</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>7</td>\n",
+       "            <td>40.31057631048775</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>8</td>\n",
+       "            <td>-7.316983704141531</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>9</td>\n",
+       "            <td>17.64005874784288</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>10</td>\n",
+       "            <td>19.98945679265288</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>11</td>\n",
+       "            <td>-34.780054357730286</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1997</td>\n",
+       "            <td>12</td>\n",
+       "            <td>64.00685004404939</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998</td>\n",
+       "            <td>1</td>\n",
+       "            <td>31.966644412344674</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998</td>\n",
+       "            <td>2</td>\n",
+       "            <td>5.511633272346428</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998</td>\n",
+       "            <td>3</td>\n",
+       "            <td>5.47085640480519</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998</td>\n",
+       "            <td>4</td>\n",
+       "            <td>18.06750267107856</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1998</td>\n",
+       "            <td>5</td>\n",
+       "            <td>-85.1907709370056</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(Decimal('1996'), Decimal('7'), None),\n",
+       " (Decimal('1996'), Decimal('8'), -8.530001451294545),\n",
+       " (Decimal('1996'), Decimal('9'), 3.51624637896504),\n",
+       " (Decimal('1996'), Decimal('10'), 42.20520805162909),\n",
+       " (Decimal('1996'), Decimal('11'), 21.54915112904513),\n",
+       " (Decimal('1996'), Decimal('12'), -0.7903823696967553),\n",
+       " (Decimal('1997'), Decimal('1'), 35.40798079057388),\n",
+       " (Decimal('1997'), Decimal('2'), -37.17785290199861),\n",
+       " (Decimal('1997'), Decimal('3'), 0.16522649038887202),\n",
+       " (Decimal('1997'), Decimal('4'), 37.579187910257275),\n",
+       " (Decimal('1997'), Decimal('5'), 1.4110800973551207),\n",
+       " (Decimal('1997'), Decimal('6'), -32.38763433709323),\n",
+       " (Decimal('1997'), Decimal('7'), 40.31057631048775),\n",
+       " (Decimal('1997'), Decimal('8'), -7.316983704141531),\n",
+       " (Decimal('1997'), Decimal('9'), 17.64005874784288),\n",
+       " (Decimal('1997'), Decimal('10'), 19.98945679265288),\n",
+       " (Decimal('1997'), Decimal('11'), -34.780054357730286),\n",
+       " (Decimal('1997'), Decimal('12'), 64.00685004404939),\n",
+       " (Decimal('1998'), Decimal('1'), 31.966644412344674),\n",
+       " (Decimal('1998'), Decimal('2'), 5.511633272346428),\n",
+       " (Decimal('1998'), Decimal('3'), 5.47085640480519),\n",
+       " (Decimal('1998'), Decimal('4'), 18.06750267107856),\n",
+       " (Decimal('1998'), Decimal('5'), -85.1907709370056)]"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "WITH MonthlySales AS (\n",
+    "    SELECT EXTRACT('month' from Order_Date) AS Month, \n",
+    "           EXTRACT('year' from Order_Date) AS Year, \n",
+    "           SUM(Unit_Price * Quantity * (1 - Discount)) AS TotalSales\n",
+    "    FROM Orders \n",
+    "    JOIN Order_Details ON Orders.Order_ID = Order_Details.Order_ID\n",
+    "    GROUP BY EXTRACT('month' from Order_Date),  EXTRACT('year' from Order_Date)\n",
+    "),\n",
+    "LaggedSales AS (\n",
+    "    SELECT Month, Year, \n",
+    "           TotalSales, \n",
+    "           LAG(TotalSales) OVER (ORDER BY Year, Month) AS PreviousMonthSales\n",
+    "    FROM MonthlySales\n",
+    ")\n",
+    "SELECT Year, Month,\n",
+    "       ((TotalSales - PreviousMonthSales) / PreviousMonthSales) * 100 AS \"Growth Rate\"\n",
+    "FROM LaggedSales;\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "79ca1e3b-26a5-4701-9217-b77b4f494cd5",
+   "metadata": {},
+   "source": [
+    "#### Identify customers with above-average order values"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "5df0d97a-15c8-42db-911d-7cbe7ce2502e",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>customer_id</th>\n",
+       "            <th>order_id</th>\n",
+       "            <th>Order Value</th>\n",
+       "            <th>Value Category</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>VINET</td>\n",
+       "            <td>10248</td>\n",
+       "            <td>439.99999809265137</td>\n",
+       "            <td>Below Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>TOMSP</td>\n",
+       "            <td>10249</td>\n",
+       "            <td>1863.4000644683838</td>\n",
+       "            <td>Above Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>HANAR</td>\n",
+       "            <td>10250</td>\n",
+       "            <td>1552.600023412704</td>\n",
+       "            <td>Above Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>VICTE</td>\n",
+       "            <td>10251</td>\n",
+       "            <td>654.0599855789542</td>\n",
+       "            <td>Below Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>SUPRD</td>\n",
+       "            <td>10252</td>\n",
+       "            <td>3597.9001445159315</td>\n",
+       "            <td>Above Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>HANAR</td>\n",
+       "            <td>10253</td>\n",
+       "            <td>1444.7999839782715</td>\n",
+       "            <td>Below Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>CHOPS</td>\n",
+       "            <td>10254</td>\n",
+       "            <td>556.62000967741</td>\n",
+       "            <td>Below Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>RICSU</td>\n",
+       "            <td>10255</td>\n",
+       "            <td>2490.4999780654907</td>\n",
+       "            <td>Above Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>WELLI</td>\n",
+       "            <td>10256</td>\n",
+       "            <td>517.8000068664551</td>\n",
+       "            <td>Below Average</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>HILAA</td>\n",
+       "            <td>10257</td>\n",
+       "            <td>1119.899953842163</td>\n",
+       "            <td>Below Average</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('VINET', 10248, 439.99999809265137, 'Below Average'),\n",
+       " ('TOMSP', 10249, 1863.4000644683838, 'Above Average'),\n",
+       " ('HANAR', 10250, 1552.600023412704, 'Above Average'),\n",
+       " ('VICTE', 10251, 654.0599855789542, 'Below Average'),\n",
+       " ('SUPRD', 10252, 3597.9001445159315, 'Above Average'),\n",
+       " ('HANAR', 10253, 1444.7999839782715, 'Below Average'),\n",
+       " ('CHOPS', 10254, 556.62000967741, 'Below Average'),\n",
+       " ('RICSU', 10255, 2490.4999780654907, 'Above Average'),\n",
+       " ('WELLI', 10256, 517.8000068664551, 'Below Average'),\n",
+       " ('HILAA', 10257, 1119.899953842163, 'Below Average')]"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "WITH OrderValues AS (\n",
+    "    SELECT Orders.Customer_ID, \n",
+    "           Orders.Order_ID, \n",
+    "           SUM(Unit_Price * Quantity * (1 - Discount)) AS \"Order Value\"\n",
+    "    FROM Orders \n",
+    "    JOIN Order_Details ON Orders.Order_ID = Order_Details.Order_ID\n",
+    "    GROUP BY Orders.Customer_ID, Orders.Order_ID\n",
+    ")\n",
+    "SELECT Customer_ID, \n",
+    "       Order_ID, \n",
+    "       \"Order Value\",\n",
+    "       CASE \n",
+    "           WHEN \"Order Value\" > AVG(\"Order Value\") OVER () THEN 'Above Average'\n",
+    "           ELSE 'Below Average'\n",
+    "       END AS \"Value Category\"\n",
+    "FROM OrderValues LIMIT 10;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bb025688-fc4f-42ab-b5d9-f46f05a61702",
+   "metadata": {},
+   "source": [
+    "#### Calculate the percentage of total sales for each product category"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "id": "be6b4eba-3bc8-44e4-9c4c-cc0483fb7736",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "8 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>category_id</th>\n",
+       "            <th>category_name</th>\n",
+       "            <th>Sales Percentage</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>8</td>\n",
+       "            <td>Seafood</td>\n",
+       "            <td>10.195732374296789</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>7</td>\n",
+       "            <td>Produce</td>\n",
+       "            <td>7.813322138303922</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1</td>\n",
+       "            <td>Beverages</td>\n",
+       "            <td>21.331025404054813</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>5</td>\n",
+       "            <td>Grains/Cereals</td>\n",
+       "            <td>7.510473482122698</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>2</td>\n",
+       "            <td>Condiments</td>\n",
+       "            <td>8.400470714786334</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>4</td>\n",
+       "            <td>Dairy Products</td>\n",
+       "            <td>18.556754766640605</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>6</td>\n",
+       "            <td>Meat/Poultry</td>\n",
+       "            <td>12.902483709246834</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>3</td>\n",
+       "            <td>Confections</td>\n",
+       "            <td>13.289737410548023</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(8, 'Seafood', 10.195732374296789),\n",
+       " (7, 'Produce', 7.813322138303922),\n",
+       " (1, 'Beverages', 21.331025404054813),\n",
+       " (5, 'Grains/Cereals', 7.510473482122698),\n",
+       " (2, 'Condiments', 8.400470714786334),\n",
+       " (4, 'Dairy Products', 18.556754766640605),\n",
+       " (6, 'Meat/Poultry', 12.902483709246834),\n",
+       " (3, 'Confections', 13.289737410548023)]"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "WITH CategorySales AS (\n",
+    "    SELECT Categories.Category_ID, Categories.Category_Name,\n",
+    "           SUM(Products.Unit_Price * Quantity * (1 - Discount)) AS \"Total Sales\"\n",
+    "    FROM Categories\n",
+    "    JOIN Products ON Categories.Category_ID = Products.Category_ID\n",
+    "    JOIN Order_Details ON Products.Product_ID = Order_Details.Product_ID\n",
+    "    GROUP BY Categories.Category_ID\n",
+    ")\n",
+    "SELECT Category_ID, Category_Name,\n",
+    "       \"Total Sales\" / SUM(\"Total Sales\") OVER () * 100 AS \"Sales Percentage\"\n",
+    "FROM CategorySales;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8df728df",
+   "metadata": {},
+   "source": [
+    "Beverages is the top category in terms of sales percentages, followed closely by Dairy Products. Produce and Grains/Cereals are the categories with the smallest sales percentage."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e4a23afd-0407-4513-812e-311b0a3f65a2",
+   "metadata": {},
+   "source": [
+    "#### Find the top 3 products sold in each category"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "cae98dcd-1cec-4847-a73b-553b8d1f41aa",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " * postgresql://postgres:***@localhost:5432/northwind\n",
+      "24 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <thead>\n",
+       "        <tr>\n",
+       "            <th>category_id</th>\n",
+       "            <th>product_id</th>\n",
+       "            <th>product_name</th>\n",
+       "            <th>Total Sales</th>\n",
+       "        </tr>\n",
+       "    </thead>\n",
+       "    <tbody>\n",
+       "        <tr>\n",
+       "            <td>1</td>\n",
+       "            <td>38</td>\n",
+       "            <td>Côte de Blaye</td>\n",
+       "            <td>153897.1748863291</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1</td>\n",
+       "            <td>43</td>\n",
+       "            <td>Ipoh Coffee</td>\n",
+       "            <td>25109.09997367859</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>1</td>\n",
+       "            <td>2</td>\n",
+       "            <td>Chang</td>\n",
+       "            <td>17719.399970583618</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>2</td>\n",
+       "            <td>63</td>\n",
+       "            <td>Vegie-spread</td>\n",
+       "            <td>18343.61561246872</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>2</td>\n",
+       "            <td>61</td>\n",
+       "            <td>Sirop d&#x27;érable</td>\n",
+       "            <td>15022.349960759282</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>2</td>\n",
+       "            <td>65</td>\n",
+       "            <td>Louisiana Fiery Hot Pepper Sauce</td>\n",
+       "            <td>14893.926944906489</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>3</td>\n",
+       "            <td>62</td>\n",
+       "            <td>Tarte au sucre</td>\n",
+       "            <td>50737.09416846588</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>3</td>\n",
+       "            <td>20</td>\n",
+       "            <td>Sir Rodney&#x27;s Marmalade</td>\n",
+       "            <td>24199.559986554086</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>3</td>\n",
+       "            <td>26</td>\n",
+       "            <td>Gumbär Gummibärchen</td>\n",
+       "            <td>21662.689146941742</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>4</td>\n",
+       "            <td>59</td>\n",
+       "            <td>Raclette Courdavault</td>\n",
+       "            <td>76683.74989898875</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>4</td>\n",
+       "            <td>60</td>\n",
+       "            <td>Camembert Pierrot</td>\n",
+       "            <td>49877.31995112449</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>4</td>\n",
+       "            <td>72</td>\n",
+       "            <td>Mozzarella di Giovanni</td>\n",
+       "            <td>27086.57939014256</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>5</td>\n",
+       "            <td>56</td>\n",
+       "            <td>Gnocchi di nonna Alice</td>\n",
+       "            <td>45351.09995948523</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>5</td>\n",
+       "            <td>64</td>\n",
+       "            <td>Wimmers gute Semmelknödel</td>\n",
+       "            <td>23487.467487137765</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>5</td>\n",
+       "            <td>42</td>\n",
+       "            <td>Singaporean Hokkien Fried Mee</td>\n",
+       "            <td>8986.599987879395</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>6</td>\n",
+       "            <td>29</td>\n",
+       "            <td>Thüringer Rostbratwurst</td>\n",
+       "            <td>84783.77159642408</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>6</td>\n",
+       "            <td>17</td>\n",
+       "            <td>Alice Mutton</td>\n",
+       "            <td>35105.849979020655</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>6</td>\n",
+       "            <td>53</td>\n",
+       "            <td>Perth Pasties</td>\n",
+       "            <td>22623.799456167217</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>7</td>\n",
+       "            <td>51</td>\n",
+       "            <td>Manjimup Dried Apples</td>\n",
+       "            <td>43846.89994909987</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>7</td>\n",
+       "            <td>28</td>\n",
+       "            <td>Rössle Sauerkraut</td>\n",
+       "            <td>27936.839044377804</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>7</td>\n",
+       "            <td>7</td>\n",
+       "            <td>Uncle Bob&#x27;s Organic Dried Pears</td>\n",
+       "            <td>22453.49998757243</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>8</td>\n",
+       "            <td>18</td>\n",
+       "            <td>Carnarvon Tigers</td>\n",
+       "            <td>30728.12496125698</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>8</td>\n",
+       "            <td>10</td>\n",
+       "            <td>Ikura</td>\n",
+       "            <td>21653.499964892864</td>\n",
+       "        </tr>\n",
+       "        <tr>\n",
+       "            <td>8</td>\n",
+       "            <td>40</td>\n",
+       "            <td>Boston Crab Meat</td>\n",
+       "            <td>19055.039585784674</td>\n",
+       "        </tr>\n",
+       "    </tbody>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, 38, 'Côte de Blaye', 153897.1748863291),\n",
+       " (1, 43, 'Ipoh Coffee', 25109.09997367859),\n",
+       " (1, 2, 'Chang', 17719.399970583618),\n",
+       " (2, 63, 'Vegie-spread', 18343.61561246872),\n",
+       " (2, 61, \"Sirop d'érable\", 15022.349960759282),\n",
+       " (2, 65, 'Louisiana Fiery Hot Pepper Sauce', 14893.926944906489),\n",
+       " (3, 62, 'Tarte au sucre', 50737.09416846588),\n",
+       " (3, 20, \"Sir Rodney's Marmalade\", 24199.559986554086),\n",
+       " (3, 26, 'Gumbär Gummibärchen', 21662.689146941742),\n",
+       " (4, 59, 'Raclette Courdavault', 76683.74989898875),\n",
+       " (4, 60, 'Camembert Pierrot', 49877.31995112449),\n",
+       " (4, 72, 'Mozzarella di Giovanni', 27086.57939014256),\n",
+       " (5, 56, 'Gnocchi di nonna Alice', 45351.09995948523),\n",
+       " (5, 64, 'Wimmers gute Semmelknödel', 23487.467487137765),\n",
+       " (5, 42, 'Singaporean Hokkien Fried Mee', 8986.599987879395),\n",
+       " (6, 29, 'Thüringer Rostbratwurst', 84783.77159642408),\n",
+       " (6, 17, 'Alice Mutton', 35105.849979020655),\n",
+       " (6, 53, 'Perth Pasties', 22623.799456167217),\n",
+       " (7, 51, 'Manjimup Dried Apples', 43846.89994909987),\n",
+       " (7, 28, 'Rössle Sauerkraut', 27936.839044377804),\n",
+       " (7, 7, \"Uncle Bob's Organic Dried Pears\", 22453.49998757243),\n",
+       " (8, 18, 'Carnarvon Tigers', 30728.12496125698),\n",
+       " (8, 10, 'Ikura', 21653.499964892864),\n",
+       " (8, 40, 'Boston Crab Meat', 19055.039585784674)]"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "WITH ProductSales AS (\n",
+    "    SELECT Products.Category_ID, \n",
+    "           Products.Product_ID, Products.Product_Name,\n",
+    "           SUM(Products.Unit_Price * Quantity * (1 - Discount)) AS \"Total Sales\"\n",
+    "    FROM Products\n",
+    "    JOIN Order_Details ON Products.Product_ID = Order_Details.Product_ID\n",
+    "    GROUP BY Products.Category_ID, Products.Product_ID\n",
+    ")\n",
+    "SELECT Category_ID, \n",
+    "       Product_ID, Product_Name,\n",
+    "       \"Total Sales\"\n",
+    "FROM (\n",
+    "    SELECT Category_ID, \n",
+    "           Product_ID, Product_Name,\n",
+    "           \"Total Sales\", \n",
+    "           ROW_NUMBER() OVER (PARTITION BY Category_ID ORDER BY \"Total Sales\" DESC) AS rn\n",
+    "    FROM ProductSales\n",
+    ") tmp\n",
+    "WHERE rn <= 3;\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.11.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}