Hola Comunidad:

En este artículo, enumero 5 funciones bastánte útiles de SQL, con sus explicaciones y algunos ejemplos de consultas👇🏻

Las 5 funciones son:

  • COALESCE
  • RANK
  • DENSE_RANK
  • ROW_NUMBER
  • Función para obtener totales acumulados
  • ¡Empezamos!

    #COALESCE

    La función COALESCE evalúa una lista de expresiones en orden de izquierda a derecha y devuelve el valor de la primera expresión non-NULL (no nula). Si todas las expresiones se corresponden con NULL (nulo), se devuelve NULL.

    La siguiente sentencia devolverá el primer valor no nulo, que es 'intersystems'.

    <span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">COALESCE</span>(<span class="hljs-literal">NULL</span>, <span class="hljs-literal">NULL</span>, <span class="hljs-literal">NULL</span>,<span class="hljs-string">'intersystems'</span>, <span class="hljs-literal">NULL</span>,<span class="hljs-string">'sql'</span>)

    Vamos a crear una tabla para ver otro ejemplo.

    <span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> EXPENSES(
        TDATE     <span class="hljs-built_in">DATE</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
        EXPENSE1   <span class="hljs-built_in">NUMBER</span> <span class="hljs-literal">NULL</span>,
        EXPENSE2   <span class="hljs-built_in">NUMBER</span> <span class="hljs-literal">NULL</span>,
        EXPENSE3   <span class="hljs-built_in">NUMBER</span> <span class="hljs-literal">NULL</span>,
        TTYPE  <span class="hljs-built_in">CHAR</span>(<span class="hljs-number">30</span>) <span class="hljs-literal">NULL</span>)

    Ahora vamos a insertar algunos valores ficticios para probar nuestra función

     <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> sqluser.expenses (tdate, expense1,expense2,expense3,ttype )  
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-01'</span>}, <span class="hljs-number">500</span>,<span class="hljs-number">400</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-string">'Present'</span>
      <span class="hljs-keyword">UNION</span> ALL
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-01'</span>}, <span class="hljs-literal">NULL</span>,<span class="hljs-number">50</span>,<span class="hljs-number">30</span>,<span class="hljs-string">'SuperMarket'</span>
      <span class="hljs-keyword">UNION</span> ALL 
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-01'</span>}, <span class="hljs-literal">NULL</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-number">30</span>,<span class="hljs-string">'Clothes'</span> 
      <span class="hljs-keyword">UNION</span> ALL
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-02'</span>}, <span class="hljs-literal">NULL</span>,<span class="hljs-number">50</span>,<span class="hljs-number">30</span> ,<span class="hljs-string">'Present'</span>
      <span class="hljs-keyword">UNION</span> ALL
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-02'</span>}, <span class="hljs-number">300</span>,<span class="hljs-number">500</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-string">'SuperMarket'</span>
      <span class="hljs-keyword">UNION</span> ALL 
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-02'</span>}, <span class="hljs-literal">NULL</span>,<span class="hljs-number">400</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-string">'Clothes'</span>   
      <span class="hljs-keyword">UNION</span> ALL
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-03'</span>}, <span class="hljs-literal">NULL</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-number">350</span> ,<span class="hljs-string">'Present'</span>
      <span class="hljs-keyword">UNION</span> ALL
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-03'</span>}, <span class="hljs-number">500</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-string">'SuperMarket'</span>
      <span class="hljs-keyword">UNION</span> ALL 
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-04'</span>}, <span class="hljs-number">200</span>,<span class="hljs-number">100</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-string">'Clothes'</span>
      <span class="hljs-keyword">UNION</span> ALL
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-06'</span>}, <span class="hljs-literal">NULL</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-number">100</span>,<span class="hljs-string">'SuperMarket'</span>
      <span class="hljs-keyword">UNION</span> ALL 
      <span class="hljs-keyword">SELECT</span> {d<span class="hljs-string">'2023-01-06'</span>}, <span class="hljs-literal">NULL</span>,<span class="hljs-number">100</span>,<span class="hljs-literal">NULL</span>,<span class="hljs-string">'Clothes'</span>  

    Consultamos los datos

    Ahora, al usar la función COALESCE recuperaremos el primer valor not NULL (no nulo) de las columnas expense1, expense2 y expense 3

    <span class="hljs-keyword">SELECT</span> TDATE,
    <span class="hljs-keyword">COALESCE</span>(EXPENSE1,EXPENSE2,EXPENSE3),
    TTYPE
    <span class="hljs-keyword">FROM</span> sqluser.expenses <span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> <span class="hljs-number">2</span>   

    Funciones #RANK vs DENSE_RANK vs ROW_NUMBER

    En SQL, hay varias formas de asignar un ranking a una fila, que analizaremos en detalle con un ejemplo. Consideramos de nuevo el mismo ejemplo anterior, pero ahora queremos saber cuál es el gasto mayor.

    Queremos saber donde gasto más dinero y para ello tenemos diferentes formas de hacerlo. Podemos usar las tres funciones: ROW_NUMBER() , RANK() y DENSE_RANK() . Ordenaremos la tabla anterior usando las tres funciones y veremos las diferencias entre ellas usando la siguiente consulta:

    Esta es nuestra consulta:

    La principal diferencia entre las tres funciones es cómo tratan los empates. Vamos a explicar las diferencias un poco más en detalle:

  • ROW_NUMBER()devuelve un número único para cada fila empezando en el 1. Cuando hay empates, asigna un número de forma arbitraria si no se define un segundo criterio.
  • RANK()devuelve un número único para cada fila empezando en el 1, excepto cuando hay empates. Entonces asignará el mismo número. Y se saltará un valor en el ranking tras el puesto del ranking duplicado.
  • DENSE_RANK() asigna el mismo valor del ranking a los valores duplicados, pero no se salta ningún puesto del ranking.
  • #Calculando Totales Acumulados (Running Totals)

    La función running total (total acumulado) es probablemente una de las funciones de ventana más útiles, especialmente cuando se quiere visualizar el crecimiento. Al usar una función de ventana con SUM(), se puede calcular una agregación acumulativa.

    Para hacerlo, solo necesitamos sumar una variable usando el agregador SUM() pero ordenar la función usando una columna TDATE. 

    Esta sería la consulta:

    Como se puede ver en la tabla, ahora tenemos la suma acumulada de la cantidad de dinero gastada, según pasan los días.  

    Conclusión

    SQL es excelente. Las funciones utilizadas en este artículo pueden ser útiles para el análisis de datos, la ciencia de datos y cualquier otro campo relacionado con los datos.

    Por eso es importante seguir actualizando y mejorando los conocimientos de SQL.

    ¡Espero que os resulte útil!