{
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "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.9.5"
    },
    "colab": {
      "provenance": []
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# IIC2413 - Control 2\n",
        "\n",
        "## Objetivo\n",
        "\n",
        "El objetivo de este control es que los estudiantes hagan uso de lo aprendido sobre Diseño de BD y sql avanzado\n",
        "\n",
        " Fecha de entrega: Viernes 29 de octubre a las 23:59\n",
        "\n",
        " Modo de entrega: subiendo la solución en este mismo archivo a Canvas."
      ],
      "metadata": {
        "id": "bd06cd6c-a9cc-4ede-8344-c05a2acc2b04"
      },
      "id": "bd06cd6c-a9cc-4ede-8344-c05a2acc2b04"
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Introducción\n",
        "\n",
        "Has sido contratado/a por la famosa empresa de video juegos _Nientiendo_ para trabajar en la implementación del nuevo juego de su exitosa franquicia _Bolsimon_, titulado _Bolsimon Unión_, el cual consiste en combinar los ya queridos monstruos de bolsillo de la franquicia con el popular género de [_Multiplayer online battle arenas_ (MOBA)](https://en.wikipedia.org/wiki/Multiplayer_online_battle_arena). El juego es de carácter casual y será lanzado en Android, iOS y en la consola _Nientiendo Swap_.\n",
        "\n",
        "Una partida de Bolsimon Unión consiste en dos **equipos** de 5 jugadores (azul y rojo) que se enfrentan durante 10 minutos con el objetivo de conseguir la mayor cantidad de puntos (**_score_**)posible. Las partidas se caracterizan por lo siguiente:\n",
        "\n",
        "* Cada jugador elige un bolsimon de los que tenga disponibles en su _pool_ de bolsimones. Un bolsimon no puede estar dos veces en una misma partida.\n",
        "* A lo largo de la partida los jugadores deben dejar fuera de combate (KO) a los bolsimones oponentes para avanzar hacia su base y así poder obtener puntos.\n",
        "* Cuando más de un jugador participa en dejar KO a un oponente, aquellos que no dieron el último golpe reciben una asistencia.\n",
        "* Un bolsimon KO vuelve a la partida luego de unos segundos.\n",
        "* El equipo ganador es aquel que logró obtener más puntos luego de 10 minutos de partida.\n",
        "* Para las estadísticas el juego guarda el detalle de cada KO y cada _score_.\n",
        "\n",
        "Como el nuevo ingeniero/a estrella del proyecto se te dejó a cargo de escribir algunas consultas para la base de datos PostgreSQL del servidor de *Bolsimon Unión* y de  mejorar el diseño de la base de datos para soportar nuevas funcionalidades en el juego. Evidentemente debes implementar aquellas mejoras en el modelo tu mismo."
      ],
      "metadata": {
        "id": "7d3f0063-53d8-4c52-9bb9-500b4ed3f10b"
      },
      "id": "7d3f0063-53d8-4c52-9bb9-500b4ed3f10b"
    },
    {
      "cell_type": "markdown",
      "source": [
        "## I. Consultas SQL (40 pts)"
      ],
      "metadata": {
        "id": "6ce8094c-bbcd-4e9c-8425-e9667307f93e"
      },
      "id": "6ce8094c-bbcd-4e9c-8425-e9667307f93e"
    },
    {
      "cell_type": "markdown",
      "source": [
        "El esquema actual de la base de datos es el siguiente:\n",
        "\n",
        "* usuario(**id int**, email varchar(100), username varchar(100), rating int)\n",
        "* bolsimon(**id int**, nombre varchar(30), tipo varchar(30))\n",
        "* partida(**id int**, fecha_inicio date, estado varchar)\n",
        "* usuario_partida_bolsimon(id int, id_jugador int, id_bolsimon int, id_partida int , equipo varchar(5))\n",
        "* ko(**id int**, id_jugador int, id_victima int, id_partida int, timestamp float, segundos_reaparecer int)\n",
        "* asistencia(**id int**, id_jugador int, id_ko int)\n",
        "* score(**id int**, id_partida int, id_jugador int, puntaje int, timestamp float)\n",
        "\n",
        "Donde:\n",
        "\n",
        "* email: Correo electrónico del usuario\n",
        "* equipo: es el nombre del equipo (rojo, azul)\n",
        "* estado: es el estado de la partida\n",
        "* fecha_inicio: es la fecha en que se inició la partida\n",
        "* id: es el identificador correspondiente a cada relación\n",
        "* id_jugador: corresponde al id de la relación usuario\n",
        "* id_bolsimon: corresponde al id de la relación bolsimon\n",
        "* id_partida: corresponde al id de la relación partida\n",
        "* id_victima: corresponde al id de la relación usuario que recibe el ataque.\n",
        "* id_ko: es id de la relación ko\n",
        "* nombre: es el nombre del Bolsimon\n",
        "* puntaje: es el el score del jugador en la partida\n",
        "* rating: es el ranking del usuario\n",
        "* segundos_reaparecer: número de segundos que el bolsimon está fuera del combate\n",
        "* timestamp: es el momento en que se produce el evento en segundos desde el inicion de la partida\n",
        "* tipo: es el tipo de bolsimon\n",
        "* username: es la identificación del usuario"
      ],
      "metadata": {
        "id": "FzhJoECRWZ8F"
      },
      "id": "FzhJoECRWZ8F"
    },
    {
      "cell_type": "markdown",
      "source": [
        "Ejecuta las siguientes celda para descargar la base de datos a tu máquina en Colab y montarla en Postgres:"
      ],
      "metadata": {
        "id": "3zJ95VnHx3hN"
      },
      "id": "3zJ95VnHx3hN"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "source": [
        "!pip install gdown\n",
        "!gdown https://drive.google.com/u/1/uc?id=1RqaKncDfYYfPMYckbM9Ui4YSkM_FsB1O"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: gdown in /usr/local/lib/python3.10/dist-packages (4.6.6)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from gdown) (3.12.2)\n",
            "Requirement already satisfied: requests[socks] in /usr/local/lib/python3.10/dist-packages (from gdown) (2.31.0)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from gdown) (1.16.0)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from gdown) (4.66.1)\n",
            "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from gdown) (4.11.2)\n",
            "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->gdown) (2.5)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (3.2.0)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (3.4)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (2.0.4)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (2023.7.22)\n",
            "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->gdown) (1.7.1)\n",
            "Downloading...\n",
            "From: https://drive.google.com/u/1/uc?id=1RqaKncDfYYfPMYckbM9Ui4YSkM_FsB1O\n",
            "To: /content/database.sql\n",
            "100% 65.5M/65.5M [00:00<00:00, 267MB/s]\n"
          ]
        }
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WznM3s3zWfQs",
        "outputId": "30abe0b9-4c8b-4ab6-e772-f7b1002fbfd5"
      },
      "id": "WznM3s3zWfQs"
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "source": [
        "# install\n",
        "!apt update\n",
        "!apt install postgresql postgresql-contrib &>log\n",
        "!service postgresql start\n",
        "!sudo -u postgres psql -c \"CREATE USER root WITH SUPERUSER\"\n",
        "# set connection\n",
        "%load_ext sql\n",
        "%config SqlMagic.feedback=False\n",
        "%config SqlMagic.autopandas=True\n",
        "%sql postgresql+psycopg2://@/postgres\n",
        "!sudo -u postgres psql -c \"CREATE SCHEMA postgres\"\n",
        "!psql postgres < /content/database.sql"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[33m\r0% [Working]\u001b[0m\r            \rGet:1 https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/ InRelease [3,626 B]\n",
            "Get:2 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64  InRelease [1,581 B]\n",
            "Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]\n",
            "Hit:4 http://archive.ubuntu.com/ubuntu jammy InRelease\n",
            "Get:5 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]\n",
            "Get:6 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64  Packages [517 kB]\n",
            "Hit:7 https://ppa.launchpadcontent.net/c2d4u.team/c2d4u4.0+/ubuntu jammy InRelease\n",
            "Get:8 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]\n",
            "Get:9 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [998 kB]\n",
            "Hit:10 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy InRelease\n",
            "Get:11 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1,284 kB]\n",
            "Get:12 http://archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 Packages [49.9 kB]\n",
            "Get:13 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,264 kB]\n",
            "Hit:14 https://ppa.launchpadcontent.net/graphics-drivers/ppa/ubuntu jammy InRelease\n",
            "Get:15 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [1,158 kB]\n",
            "Get:16 http://archive.ubuntu.com/ubuntu jammy-backports/universe amd64 Packages [28.1 kB]\n",
            "Hit:17 https://ppa.launchpadcontent.net/ubuntugis/ppa/ubuntu jammy InRelease\n",
            "Fetched 5,641 kB in 3s (2,207 kB/s)\n",
            "Reading package lists... Done\n",
            "Building dependency tree... Done\n",
            "Reading state information... Done\n",
            "18 packages can be upgraded. Run 'apt list --upgradable' to see them.\n",
            " * Starting PostgreSQL 14 database server\n",
            "   ...done.\n",
            "CREATE ROLE\n",
            "CREATE SCHEMA\n",
            "SET\n",
            "SET\n",
            "SET\n",
            "SET\n",
            "SET\n",
            " set_config \n",
            "------------\n",
            " \n",
            "(1 row)\n",
            "\n",
            "SET\n",
            "SET\n",
            "SET\n",
            "SET\n",
            "SET\n",
            "SET\n",
            "CREATE TABLE\n",
            "ALTER TABLE\n",
            "CREATE TABLE\n",
            "ALTER TABLE\n",
            "CREATE TABLE\n",
            "ALTER TABLE\n",
            "CREATE TABLE\n",
            "ALTER TABLE\n",
            "CREATE TABLE\n",
            "ALTER TABLE\n",
            "CREATE TABLE\n",
            "ALTER TABLE\n",
            "CREATE TABLE\n",
            "ALTER TABLE\n",
            "COPY 790916\n",
            "COPY 50\n",
            "COPY 791355\n",
            "COPY 20000\n",
            "COPY 289942\n",
            "COPY 2000\n",
            "COPY 200000\n",
            "CREATE INDEX\n",
            "CREATE INDEX\n",
            "CREATE INDEX\n",
            "CREATE INDEX\n",
            "CREATE INDEX\n",
            "CREATE INDEX\n",
            "CREATE INDEX\n"
          ]
        }
      ],
      "metadata": {
        "id": "Nxul3UKVwqZu",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "8c47516e-7820-4564-bbcd-cf8320b6345c"
      },
      "id": "Nxul3UKVwqZu"
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "source": [
        "%%sql\n",
        "ALTER TABLE usuario ADD PRIMARY KEY (id);\n",
        "ALTER TABLE bolsimon ADD PRIMARY KEY (id);\n",
        "ALTER TABLE partida ADD PRIMARY KEY (id);\n",
        "ALTER TABLE usuario_partida_bolsimon ADD PRIMARY KEY (id);\n",
        "ALTER TABLE ko ADD PRIMARY KEY (id);\n",
        "ALTER TABLE asistencia ADD PRIMARY KEY (id);\n",
        "ALTER TABLE score ADD PRIMARY KEY (id);"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            " * postgresql+psycopg2://@/postgres\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Empty DataFrame\n",
              "Columns: []\n",
              "Index: []"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-7080154e-aa7a-4b47-ae89-5032c474334a\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-7080154e-aa7a-4b47-ae89-5032c474334a')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-7080154e-aa7a-4b47-ae89-5032c474334a button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-7080154e-aa7a-4b47-ae89-5032c474334a');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ]
          },
          "metadata": {},
          "execution_count": 3
        }
      ],
      "metadata": {
        "id": "47uzo2VFFUI2",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 70
        },
        "outputId": "a0e18e61-4f75-4354-b6c1-54a78c2a40a4"
      },
      "id": "47uzo2VFFUI2"
    },
    {
      "cell_type": "markdown",
      "source": [
        "Si la siguiente consulta funciona bien entonces estas listo para empezar."
      ],
      "metadata": {
        "id": "ZJZOANPpyD9d"
      },
      "id": "ZJZOANPpyD9d"
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "source": [
        "%%sql\n",
        "SELECT * FROM bolsimon LIMIT 20;"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            " * postgresql+psycopg2://@/postgres\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "    id     nombre      tipo\n",
              "0    0   Venosoor     grass\n",
              "1    1  Churizurd      fire\n",
              "2    2  Blustoise     water\n",
              "3    3    Pikecho  electric\n",
              "4    4     Miwtwa   psychic\n",
              "5    5        Maw   psychic\n",
              "6    6    Metipod       bug\n",
              "7    7     Wiidli       bug\n",
              "8    8     Pidgoy    normal\n",
              "9    9    Pidguot    normal\n",
              "10  10    Rettete    normal\n",
              "11  11    Spiuruw    normal\n",
              "12  12  Sundshriw    ground\n",
              "13  13   Nidorine    poison\n",
              "14  14  Nidoquaan    poison\n",
              "15  15    Nidoren    poison\n",
              "16  16    Venonit       bug\n",
              "17  17    Psydack     water\n",
              "18  18    Galduck     water\n",
              "19  19     Munkuy  fighting"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-64c37f96-ee15-45e0-8903-519d89f0cf51\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>id</th>\n",
              "      <th>nombre</th>\n",
              "      <th>tipo</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "      <td>Venosoor</td>\n",
              "      <td>grass</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>1</td>\n",
              "      <td>Churizurd</td>\n",
              "      <td>fire</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2</td>\n",
              "      <td>Blustoise</td>\n",
              "      <td>water</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>Pikecho</td>\n",
              "      <td>electric</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>4</td>\n",
              "      <td>Miwtwa</td>\n",
              "      <td>psychic</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>5</td>\n",
              "      <td>Maw</td>\n",
              "      <td>psychic</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>6</td>\n",
              "      <td>Metipod</td>\n",
              "      <td>bug</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>7</td>\n",
              "      <td>Wiidli</td>\n",
              "      <td>bug</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>8</td>\n",
              "      <td>Pidgoy</td>\n",
              "      <td>normal</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>9</td>\n",
              "      <td>Pidguot</td>\n",
              "      <td>normal</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>10</td>\n",
              "      <td>Rettete</td>\n",
              "      <td>normal</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>11</td>\n",
              "      <td>Spiuruw</td>\n",
              "      <td>normal</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>12</td>\n",
              "      <td>Sundshriw</td>\n",
              "      <td>ground</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>13</td>\n",
              "      <td>Nidorine</td>\n",
              "      <td>poison</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>14</td>\n",
              "      <td>Nidoquaan</td>\n",
              "      <td>poison</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>15</td>\n",
              "      <td>Nidoren</td>\n",
              "      <td>poison</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>16</td>\n",
              "      <td>Venonit</td>\n",
              "      <td>bug</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>17</td>\n",
              "      <td>Psydack</td>\n",
              "      <td>water</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18</th>\n",
              "      <td>18</td>\n",
              "      <td>Galduck</td>\n",
              "      <td>water</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19</th>\n",
              "      <td>19</td>\n",
              "      <td>Munkuy</td>\n",
              "      <td>fighting</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-64c37f96-ee15-45e0-8903-519d89f0cf51')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-64c37f96-ee15-45e0-8903-519d89f0cf51 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-64c37f96-ee15-45e0-8903-519d89f0cf51');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-a5d4f909-59c0-4737-be30-a31cd28a7687\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-a5d4f909-59c0-4737-be30-a31cd28a7687')\"\n",
              "            title=\"Suggest charts.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-a5d4f909-59c0-4737-be30-a31cd28a7687 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ]
          },
          "metadata": {},
          "execution_count": 4
        }
      ],
      "metadata": {
        "id": "snYViz-GxH8V",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 694
        },
        "outputId": "8488f550-5338-4fa5-9c55-47104ac2d320"
      },
      "id": "snYViz-GxH8V"
    },
    {
      "cell_type": "markdown",
      "source": [
        "Escribe las siguientes consultas necesarias para el funcionamiento de Bolsimon Unión:"
      ],
      "metadata": {
        "id": "SbIxdBeh-mxd"
      },
      "id": "SbIxdBeh-mxd"
    },
    {
      "cell_type": "markdown",
      "source": [
        "Pro Tips:\n",
        "* La sentencia [`LIMIT`](https://www.postgresql.org/docs/8.1/queries-limit.html)\n",
        "que limita los resultados de una consulta es necesaria para algunas consultas.\n",
        "* Algunas de las consultas pueden ser complejas por lo que la sentencia [`WITH`](https://www.postgresql.org/docs/8.1/queries-limit.html) que permite \"renombrar\" una consulta, podría ser útil para mejorar la legibilidad de tus consultas y disminuir la duplicacion.\n",
        "* Para transformar valores nulos a algún valor que nos interese, se puede usar `COALESCE(<valor potencialmente nulo>, <otro valor>)`, por ejemplo, `SELECT COALESCE(age, 50)` para considerar que todos quienes no tengan edad especificada se asuman de 50 años."
      ],
      "metadata": {
        "id": "2CgC8M01KAhe"
      },
      "id": "2CgC8M01KAhe"
    },
    {
      "cell_type": "markdown",
      "source": [
        "1. Para el usuario de email `elizabeth@cooper.net` encontrar la cantidad total de KOs, Asistencias y puntaje obtenidos en todas sus partidas. (4 pts)"
      ],
      "metadata": {
        "id": "D_rOxD5P_Tx8"
      },
      "id": "D_rOxD5P_Tx8"
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "source": [
        "%%sql"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "UsageError: %%sql is a cell magic, but the cell body is empty. Did you mean the line magic %sql (single %)?\n"
          ]
        }
      ],
      "metadata": {
        "id": "gA9KS8c9-2WH",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "9c17f4da-cecd-4d40-d4d3-d6ad05187eac"
      },
      "id": "gA9KS8c9-2WH"
    },
    {
      "cell_type": "markdown",
      "source": [
        "2. Una consulta que entregue el equipo ganador de la partida de id `12345` (4 pts)"
      ],
      "metadata": {
        "id": "SpUafU5gCA89"
      },
      "id": "SpUafU5gCA89"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "5IIChHP2AU26"
      },
      "id": "5IIChHP2AU26"
    },
    {
      "cell_type": "markdown",
      "source": [
        "3. Encontrar los usernames  y ratings de los 5 usuarios que han usado el  Bolsimon  `Pikecho` en más partidas. (4 pts)"
      ],
      "metadata": {
        "id": "zfyPSqU6_wAB"
      },
      "id": "zfyPSqU6_wAB"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "Q3e78TmMCLsS"
      },
      "id": "Q3e78TmMCLsS"
    },
    {
      "cell_type": "markdown",
      "source": [
        "4. Para la partida de id `256` mostrar el tiempo en segundos que cada bolsimon pasó fuera de combate. (4 pts)\n"
      ],
      "metadata": {
        "id": "acpsIX_IDvCX"
      },
      "id": "acpsIX_IDvCX"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "rZaZZeMuFDxD"
      },
      "id": "rZaZZeMuFDxD"
    },
    {
      "cell_type": "markdown",
      "source": [
        "5. Los ids de la pareja de jugadores que más asistencias se hayan hecho mutuamente. (Es decir si `A` asistió a `B` 5 veces y `B` a `A` 3 veces el total es 8) (4 pts)"
      ],
      "metadata": {
        "id": "-sb41RGTBg6n"
      },
      "id": "-sb41RGTBg6n"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "4DiQWhMpBnxR"
      },
      "id": "4DiQWhMpBnxR"
    },
    {
      "cell_type": "markdown",
      "source": [
        "6. Encontrar el username del usuario que jugó más partidas en un día. Tip: Con la sentencia `date_trunc('day', <fecha>)` se puede extraer el día a partir de una fecha completa. (4 pts)"
      ],
      "metadata": {
        "id": "t77ZAJ3VCtde"
      },
      "id": "t77ZAJ3VCtde"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "rn77LxTNDrQG"
      },
      "id": "rn77LxTNDrQG"
    },
    {
      "cell_type": "markdown",
      "source": [
        "7. Encontrar el Bolsimon, equipo, la cantidad KOs realizados y puntos totales de cada jugador de la partida de ID `32`. Los jugadores del equipo ganador deben aparecer primero y los jugadores de cada equipo deben ir ordenados por puntos totales y KOs realizados de manera descendente. (8 pts)"
      ],
      "metadata": {
        "id": "jSq7QWTzAT80"
      },
      "id": "jSq7QWTzAT80"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "K0WXhMUgBPdG"
      },
      "id": "K0WXhMUgBPdG"
    },
    {
      "cell_type": "markdown",
      "source": [
        "8. Encontrar el nombre del Bolsimon de mejor y peor winrate (% de victorias).Muestre los winrates de cada uno (basta con mostrar 2 filas en que una corresponde al mejor y otra al peor). (8 pts)\n",
        "\n",
        "**Protips**:\n",
        "- Para contar la cantidad de `true` en una columna (o agregación) hay que castear los booleanos a entero (`1` o `0`) y despues sumar, algo así:\n",
        "`SUM(CAST(<expresion o columna booleana> AS INTEGER)`.\n",
        "- Para hacer división con decimales en postgres es necesario que al menos uno de los dos términos sea de tipo `FLOAT`, es decir podemos hacer `SELECT CAST(1 AS FLOAT) / 2` y eso da `0.5`."
      ],
      "metadata": {
        "id": "UYQY5S7bBsJB"
      },
      "id": "UYQY5S7bBsJB"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "37x_4TfDBqjP"
      },
      "id": "37x_4TfDBqjP"
    },
    {
      "cell_type": "markdown",
      "source": [
        "## II. Aumentar el diseño de la base de datos. (20 pts)"
      ],
      "metadata": {
        "id": "4kA5zXJ_GuMI"
      },
      "id": "4kA5zXJ_GuMI"
    },
    {
      "cell_type": "markdown",
      "source": [
        "Evidentemente el esquema actual no soporta todas las funcionalidades necesarias para que el juego se convierta en el éxito que el mercado espera. La funcionalidad más importante que se debe implementar ahora es que cada bolsimon pueda tener sus propios ataques (ej: _el impactrueno_).\n",
        "\n",
        "Los ataques tienen nombre y nivel (básico, intermedio y avanzado).\n",
        "\n",
        "Cada bolsimon tiene 3 pares de ataques (1 par de cada nivel.). Dentro de una partida un jugador debe elegir un ataque de cada par. Notar que los ataques no son necesariamente únicos de un solo Bolsimon.\n",
        "\n",
        "1. Agrega al esquema anterior las tablas  y restricciones de integridad que creas necesarias para modelar la nueva funcionalidad. Escribe y ejecuta las sentencias SQL necesarias para implementar tu esquema en la base de datos.\n",
        "\n",
        "2. Justifica que tu esquema está bien diseñado."
      ],
      "metadata": {
        "id": "icEt_M403-bQ"
      },
      "id": "icEt_M403-bQ"
    },
    {
      "cell_type": "markdown",
      "source": [
        "*Responde acá*"
      ],
      "metadata": {
        "id": "RKKenOu5BNIL"
      },
      "id": "RKKenOu5BNIL"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "%%sql"
      ],
      "outputs": [],
      "metadata": {
        "id": "xRM0kOGbEjiR"
      },
      "id": "xRM0kOGbEjiR"
    }
  ]
}