es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Top 2 de cada categoría: Hardware: 1. Procesador Intel Core i7-9700K 2. Tarjeta gráfica NVIDIA GeForce RTX 2080 Ti Software: 1. Sistema operativo Windows 10 2. Suite de productividad Microsoft Office 365 Redes: 1. Router Cisco ISR 4321 2. Switch Cisco Catalyst 3850 Almacenamiento: 1. Unidad de estado sólido (SSD) Samsung 860 EVO 2. Disco duro externo Western Digital My Passport Seguridad: 1. Firewall Fortinet FortiGate 600E 2. Antivirus Symantec Endpoint Protection Virtualización: 1. Plataforma de virtualización VMware vSphere 2. Hipervisor Microsoft Hyper-V Servidores: 1. Servidor HP ProLiant DL380 Gen10 2. Servidor Dell PowerEdge R740

Necesito los 2 mejores pokemones de cada tipo.
Tengo este código:

SELECT 
   [Name], 
   [Type 1],
   Total,
   rank() OVER(partition by [Type 1] order by Total,Hp,Attack,Defense,Speed,# desc) AS Ranking
FROM PokemonProject..Pokemon

La tabla de resultados se ve así:

<table>
<thead>
  <tr>
    <th>Name</th>
    <th>Type 1</th>
    <th>Total</th>
    <th>Ranking</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>Xerneas</td>
    <td>Fairy</td>
    <td>680</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Florges</td>
    <td>Fairy</td>
    <td>552</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Ho-oh</td>
    <td>Fire</td>
    <td>680</td>
    <td>1</td>
  </tr>
  <tr>
    <td>CharizardMega Charizard X</td>
    <td>Fire</td>
    <td>634</td>
    <td>2</td>
  </tr>
  <tr>
    <td>CharizardMega Charizard Y</td>
    <td>Fire</td>
    <td>634</td>
    <td>3</td>
  </tr>
</tbody>
</table>

Sé que necesito una cláusula WHERE, pero no sé cómo hacerlo. Algo como “WHERE ranking <= 2”, pero cuando ejecuto el SQL dice: “Nombre de columna no válido ‘ranking'”. Soy nuevo en SQL.

Tags:  ,

Answer

  1. Avatar for davy.ai

    ¡Hola!

    Para filtrar solo los 2 mejores pokemones de cada tipo basados en su puntuación Total, puedes envolver toda la consulta dentro de otra declaración SELECT y usar la cláusula WHERE para filtrar los resultados basados en la columna Ranking.

    Así es cómo se vería la consulta actualizada:

    SELECT 
        Name, 
        Type1, 
        Total, 
        Ranking
    FROM 
        (SELECT 
            Name, 
            Type1, 
            Total, 
            RANK() OVER (PARTITION BY Type1 ORDER BY Total DESC) AS Ranking
         FROM 
            PokemonProject..Pokemon) AS T
    WHERE 
        Ranking <= 2;
    

    Esta consulta primero generará el ranking de cada pokemon dentro de sus respectivos tipos (usando la función RANK()), y luego seleccionará solo aquellos con un ranking de 1 o 2 (usando la cláusula WHERE).

    ¡Espero que esto te ayude! Déjame saber si tienes más preguntas.

Comments are closed.