Saltar al contenido

BigQuery: instrucción DELETE para eliminar duplicados

Posterior a buscar en diferentes repositorios y páginas webs de internet al terminar encontramos la solución que te mostraremos pronto.

Solución:

A continuación en realidad: o) funciona

#standardSQL
DELETE FROM `yourproject.yourdataset.duplicates`
WHERE STRUCT(id, loadTime) NOT IN (
        SELECT AS STRUCT id, MAX(loadTime) loadTime 
        FROM `yourproject.yourdataset.duplicates` 
        GROUP BY id)  

Nota: se supone que loadTime también es único, lo que significa que si para una identificación dada hay más de un registro con el último loadTime, todos se conservarán

De la documentación de sintaxis, el argumento para DELETE necesita ser una mesa, y no hay provisión para usar una WITH cláusula. Esto tiene sentido dado que no puede eliminar de lo que es esencialmente una vista lógica (un CTE). Puede expresar lo que quiere poniendo la lógica dentro del filtro, por ejemplo

DELETE
FROM duplicates AS d
WHERE (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY loadTime DESC)
       FROM `duplicates` AS d2
       WHERE d.id = d2.id AND d.loadTime = d2.loadTime) > 1;

Esta tiene que ser la forma más fácil:

create or replace table `myproject.mydataset.duplicates` as (
select distinct *
from `myproject.mydataset.duplicates`)

si tienes un array tipo de datos, intente esto:

-- build a test table with a duplicate and an array datatype column --
create or replace table DW.pmoTest as (
select 1 as ID, 'peter' as firstname,ARRAY[1, 2, 3]  as int_array, current_date as createdate
union all
select 1 as ID, 'peter' as firstname,ARRAY[1, 7, 3] as int_array, current_date as createdate
union all
select 2 as ID, 'chamri' as firstname,ARRAY[1, 2, 39, 4] as int_array, current_date as createdate
);

-- recreate table without duplicate row
create or replace table DW.pmoTest as (
SELECT col.* FROM (
  SELECT ARRAY_AGG(tbl ORDER BY createdate LIMIT 1)[OFFSET(0)]  col
  FROM DW.pmoTest tbl
  GROUP BY ID
  )
);

Aquí puedes ver las comentarios y valoraciones de los usuarios

Si para ti ha sido provechoso este post, nos gustaría que lo compartas con el resto juniors y nos ayudes a extender este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *