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.

UNNEST/Flatten en Snowflake

Tengo una consulta de MySQL que quiero convertir en Snowflake.

Consulta de MySQL:

WITH t AS (
    select id,
        fecha,
        copt,
        split(copt, ‘|’) [ 1 ] as “abc”,
        split(copt, ‘|’) [ 2 ] as “def”,
        split(copt, ‘|’) [ 3 ] as “xyz”,
    from tablename
    where id in (
            123,
            456,
            789,
        )
        and fecha >= dateadd(‘day’, -6, to_date(‘2021-12-17’))
        and fecha <= ‘2021-12-17’
        and copt like ‘%|%|%|%|%|%|%|%|%|%|%%’
)
SELECT t.id,
    t.fecha,
    catId,
    REPLACE(productId, ‘‘, ”) as productId,
FROM t
    CROSS JOIN UNNEST(
        split(t.”abc”, ‘
‘),
        split(t.”def”, ‘‘),
        split(t.”xyz”, ‘
‘),
    ) as x(catId, productId, cantidad)
where productid != ”
order by id

He intentado reemplazar UNNEST() con FLATTEN() pero no tuve éxito.

¿Alguien puede ayudarme a convertir esta consulta de MySQL a Snowflake?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Aquí está la consulta de Snowflake traducida:

    CON t AS (
      SELECT id,
             fecha,
             copt,
             SPLIT_PART(copt, '|', 1) AS "abc",
             SPLIT_PART(copt, '|', 2) AS "def",
             SPLIT_PART(copt, '|', 3) AS "xyz"
      FROM nombre_tabla
      WHERE id IN (123, 456, 789)
        AND fecha >= DATEADD('day', -6, '2021-12-17'::DATE)
        AND fecha <= '2021-12-17'::DATE
        AND copt LIKE '%|%|%|%|%|%|%|%|%|%|%'
    ),
    x AS (
      SELECT t.id,
             t.fecha,
             SPLIT_PART(catId, '_', 1) AS catId,
             REPLACE(SPLIT_PART(productId, '_', 1), '_', '') AS productId,
             SPLIT_PART(quantity, '_', 1) AS quantity
      FROM t
      CROSS JOIN LATERAL FLATTEN(
        INPUT => ARRAY_CONSTRUCT(
                  SPLIT(t."abc", '_'),
                  SPLIT(t."def", '_'),
                  SPLIT(t."xyz", '_')
                )
      ) x
      WHERE productId != ''
    )
    SELECT *
    FROM x
    ORDER BY id;
    

    Los cambios principales son reemplazar SPLIT() por SPLIT_PART() para extraer partes específicas de la cadena dividida, y usar ARRAY_CONSTRUCT() para crear el array de entrada para FLATTEN(), que es una unión lateral en Snowflake. También debes tener en cuenta que DATEADD() y '2021-12-17'::DATE se utilizan para manipulación de fechas en Snowflake.

Comments are closed.