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.

Revisión de Consulta – Snowflake

Tengo una consulta en snowflake que funciona como se espera, pero siento que debe haber una mejor manera de hacer esto. Por eso, estoy revisando si alguien tiene una solución mejor y más eficiente para esto.

Quiero contar cuántos usuarios tienen SA4 y SA5. Luego verificar si son multi-unit o no. Para aquellos que son multi-unit, contar cuántos de cada uno de los otros productos ST tienen.

Tabla original:

AB4_ind AB5_ind Multi_unit AB300_ind AB10_ind AB20_ind AB30_ind
1 0 1 1 1 0 1
1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 1 1 1 0 0 0
1 1 1 0 0 1 0
0 1 1 0 0 1 1

Tabla de salida deseada con consulta:

Producto CNT Multi AB300 AB10 AB20 AB30
AB4 3 1 1 1 0 1
AB5 4 3 1 0 2 1

Aquí está la consulta que funciona, pero siento que debe haber una mejor manera de hacer esto. Por favor, háganme saber sus pensamientos 🙂 Agradecido

SELECT
‘AB4’ AS Producto,
COUNT() AS CNT,
SUM(CASE WHEN MULTI_UNIT = 1 THEN 1 ELSE 0 END) AS Multi,
SUM(AB300_IND) AS AB300,
SUM(AB10_IND) AS AB10,
SUM(AB20_IND) AS AB20,
SUM(AB30_IND) AS AB30,
FROM TABLE.VIEW.MAW
WHERE AB4_IND = 1
GROUP BY 1
UNION
SELECT
‘AB5’ AS Producto,
COUNT(
) AS CNT,
SUM(CASE WHEN MULTI_UNIT = 1 THEN 1 ELSE 0 END) AS Multi,
SUM(AB300_IND) AS AB300,
SUM(AB10_IND) AS AB10,
SUM(AB20_IND) AS AB20,
SUM(AB30_IND) AS AB30,
FROM TABLE.VIEW.MAW
WHERE AB5_IND = 1
GROUP BY 1

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Existen algunas formas en las que potencialmente se podría optimizar esta consulta, dependiendo del tamaño de tu conjunto de datos y tus requisitos específicos. Aquí tienes un par de opciones:

    1. Consolida las dos consultas usando una cláusula GROUP BY

    En lugar de ejecutar dos consultas separadas (una para AB4 y otra para AB5), puedes consolidarlas en una sola consulta usando una cláusula GROUP BY:

    SELECT
        CASE
            WHEN AB4_IND = 1 THEN 'AB4'
            WHEN AB5_IND = 1 THEN 'AB5'
        END AS Producto,
        COUNT(*) AS CNT,
        SUM(CASE WHEN MULTI_UNIT = 1 THEN 1 ELSE 0 END) AS MULTI,
        SUM(CASE WHEN AB300_IND = 1 THEN 1 ELSE 0 END) AS AB300,
        SUM(CASE WHEN AB10_IND = 1 THEN 1 ELSE 0 END) AS AB10,
        SUM(CASE WHEN AB20_IND = 1 THEN 1 ELSE 0 END) AS AB20,
        SUM(CASE WHEN AB30_IND = 1 THEN 1 ELSE 0 END) AS AB30
    FROM TABLE.VIEW.MAW
    WHERE AB4_IND = 1 OR AB5_IND = 1
    GROUP BY CASE
            WHEN AB4_IND = 1 THEN 'AB4'
            WHEN AB5_IND = 1 THEN 'AB5'
        END
    

    Esta consulta agrupará los resultados por la columna Producto (que se calcula dinámicamente en función de si AB4_IND o AB5_IND es igual a 1) y calculará las funciones de agregación (COUNT, SUM) en consecuencia. Esto debería ser más eficiente que ejecutar dos consultas separadas.

    1. Usa una subconsulta para filtrar filas multi_unit

    Si tu conjunto de datos es particularmente grande y la consulta anterior aún es lenta, puedes intentar usar una subconsulta para filtrar las filas que no son multi_unit antes de ejecutar las funciones de agregación:

    SELECT
        'AB4' AS Producto,
        COUNT(*) AS CNT,
        SUM(CASE WHEN MULTI_UNIT = 1 THEN 1 ELSE 0 END) AS MULTI,
        SUM(CASE WHEN AB300_IND = 1 THEN 1 ELSE 0 END) AS AB300,
        SUM(CASE WHEN AB10_IND = 1 THEN 1 ELSE 0 END) AS AB10,
        SUM(CASE WHEN AB20_IND = 1 THEN 1 ELSE 0 END) AS AB20,
        SUM(CASE WHEN AB30_IND = 1 THEN 1 ELSE 0 END) AS AB30
    FROM (
        SELECT *
        FROM TABLE.VIEW.MAW
        WHERE AB4_IND = 1 AND MULTI_UNIT = 1
    ) t1
    UNION
    SELECT
        'AB5' AS Producto,
        COUNT(*) AS CNT,
        SUM(CASE WHEN MULTI_UNIT = 1 THEN 1 ELSE 0 END) AS MULTI,
        SUM(CASE WHEN AB300_IND = 1 THEN 1 ELSE 0 END) AS AB300,
        SUM(CASE WHEN AB10_IND = 1 THEN 1 ELSE 0 END) AS AB10,
        SUM(CASE WHEN AB20_IND = 1 THEN 1 ELSE 0 END) AS AB20,
        SUM(CASE WHEN AB30_IND = 1 THEN 1 ELSE 0 END) AS AB30
    FROM (
        SELECT *
        FROM TABLE.VIEW.MAW
        WHERE AB5_IND = 1 AND MULTI_UNIT = 1
    ) t2
    

    Esta consulta usa una subconsulta para filtrar las filas donde MULTI_UNIT no es igual a 1, por lo que las funciones de agregación solo deben ejecutarse en un subconjunto de los datos. Nuevamente, esto debería ser más eficiente que ejecutar la consulta original para cada producto por separado.

Comments are closed.