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
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:
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:
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.
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:
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.