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.

Función de hash SQL

Quiero crear una columna de hash en mi tabla. Quiero colocar todos los valores de una fila en esa columna, como concatenación, y reemplazar null con cualquier símbolo. Y cada celda debe estar separada por un delimitador.

Por ejemplo:

A B C D ColumnaHash
1 2 Null 4 1/2//4
12 Null 4 5 12/
/4/5

Quiero hacer esto en varias tablas, por lo que necesito una consulta dinámica para esto.

Por favor, dime cómo puedo hacer esto en BigQuery.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una columna de hash en BigQuery y concatenar todos los valores en una fila, incluyendo la sustitución de los valores nulos por un símbolo y separando cada celda con un delimitador, siga estos pasos:

    1. Cree una función definida por el usuario (UDF) que tome una fila como entrada y devuelva la cadena concatenada con valores nulos reemplazados por un símbolo y usando un delimitador.
    CREATE TEMP FUNCTION CONCAT_ROW_WITH_DELIMITER(
       row STRUCT<a int64,="" b="" int64,="" c="" int64,="" d="" int64="">,
       delimiter STRING,
       null_symbol STRING
    ) AS (
      CONCAT(CAST(IFNULL(row.A, null_symbol) AS STRING), delimiter, 
             CAST(IFNULL(row.B, null_symbol) AS STRING), delimiter, 
             CAST(IFNULL(row.C, null_symbol) AS STRING), delimiter, 
             CAST(IFNULL(row.D, null_symbol) AS STRING))
    );
    
    1. Use la UDF recién creada en una consulta para agregar una nueva columna con los valores concatenados a la tabla existente.
    SELECT A, B, C, D, CONCAT_ROW_WITH_DELIMITER(STRUCT(A,B,C,D), "/", "_") AS ColumnaHash
    FROM your_table;
    

    Tenga en cuenta que, en el ejemplo anterior, “your_table” es el nombre de la tabla a la que desea agregar la columna de hash.

    1. Para ejecutar la consulta dinámica en varias tablas, puede utilizar la vista “INFORMATION_SCHEMA.TABLES” para recuperar la lista de tablas en un conjunto de datos y utilizar un bucle para ejecutar la consulta en cada tabla.
    DECLARE table_name STRING;
    DECLARE query_string STRING;
    DECLARE done INT64 DEFAULT 0;
    
    DECLARE table_cursor CURSOR FOR 
      SELECT table_name 
      FROM your_dataset.INFORMATION_SCHEMA.TABLES 
      WHERE table_catalog = 'your_catalog'
      AND table_schema = 'your_schema'
      AND table_name LIKE 'your_table_prefix%';
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    OPEN table_cursor;
    table_loop: LOOP
      FETCH table_cursor INTO table_name;
      IF done = 1 THEN 
        LEAVE table_loop;
      END IF;
    
      SET query_string = 
        'SELECT A, B, C, D, CONCAT_ROW_WITH_DELIMITER(STRUCT(A,B,C,D), "/", "_") AS ColumnaHash ' +
        'FROM ' + table_name;
    
      EXECUTE IMMEDIATE query_string;
    
    END LOOP table_loop;
    
    CLOSE table_cursor;
    

    Tenga en cuenta que, en el ejemplo anterior, “your_dataset” es el nombre del conjunto de datos donde se encuentran las tablas, “your_catalog” es el nombre de su proyecto de BigQuery, y “your_schema” es el nombre del esquema que contiene las tablas. Además, “your_table_prefix” es el prefijo de los nombres de tabla en los que desea ejecutar la consulta (por ejemplo, “datos_de_venta_”).

    Al ejecutar el código anterior, la consulta se ejecutará en cada una de las tablas por separado, y se agregará una nueva columna con los valores concatenados a cada tabla.

Comments are closed.