J'ai une table avec plus de 1 million de lignes de données et plus de 20 colonnes.
Dans ma table (tableX), j'ai identifié les enregistrements en double (~ 80k) dans une colonne particulière (troubleColonne).
Si possible, j'aimerais conserver le nom de la table d'origine et supprimer les enregistrements en double de ma colonne problématique, sinon je pourrais créer une nouvelle table (tableXfinal) avec le même schéma mais sans les doublons.
Je ne maîtrise pas SQL ni aucun autre langage de programmation, veuillez donc excuser mon ignorance.
delete from Accidents.CleanedFilledCombined
where Fixed_Accident_Index
in(select Fixed_Accident_Index from Accidents.CleanedFilledCombined
group by Fixed_Accident_Index
having count(Fixed_Accident_Index) >1);
Vous pouvez supprimer les doublons en exécutant une requête qui réécrit votre table (vous pouvez utiliser la même table que la destination ou créer une nouvelle table, vérifier qu'elle a ce que vous voulez, puis la copier sur l'ancienne table).
Une requête qui devrait fonctionner est ici:
SELECT *
FROM (
SELECT
*,
ROW_NUMBER()
OVER (PARTITION BY Fixed_Accident_Index)
row_number
FROM Accidents.CleanedFilledCombined
)
WHERE row_number = 1
Une alternative à la réponse de Jordan - celle-ci a une meilleure balance quand il y a trop de doublons:
#standardSQL
SELECT event.* FROM (
SELECT ARRAY_AGG(
t ORDER BY t.created_at DESC LIMIT 1
)[OFFSET(0)] event
FROM `githubarchive.month.201706` t
# GROUP BY the id you are de-duplicating by
GROUP BY actor.id
)
Ou une version plus courte (prend n'importe quelle ligne au lieu de la plus récente):
SELECT k.*
FROM (
SELECT ARRAY_AGG(x LIMIT 1)[OFFSET(0)] k
FROM `fh-bigquery.reddit_comments.2017_01` x
GROUP BY id
)
Pour dédupliquer des lignes sur une table existante:
CREATE OR REPLACE TABLE `deleting.deduplicating_table`
AS
# SELECT id FROM UNNEST([1,1,1,2,2]) id
SELECT k.*
FROM (
SELECT ARRAY_AGG(row LIMIT 1)[OFFSET(0)] k
FROM `deleting.deduplicating_table` row
GROUP BY id
)
Si votre schéma n’a pas d’enregistrement - sous variation
de la réponse de Jordan fonctionnera assez bien pour écrire sur la même table ou sur une nouvelle table, etc.
SELECT <list of original fields>
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Fixed_Accident_Index) AS pos,
FROM Accidents.CleanedFilledCombined
)
WHERE pos = 1
Dans des cas plus génériques - avec un schéma complexe avec des enregistrements/champs en réseau, etc. - l'approche ci-dessus peut être un défi.
Je proposerais d'essayer d'utiliser Tabledata: insertAll API avec rows []. InsertId défini sur Fixed_Accident_Index respectif pour chaque ligne. Dans ce cas, les doublons seront éliminés par BigQuery
Bien sûr, cela impliquera un certain codage côté client - il est donc possible que cela ne soit pas pertinent pour cette question particulière… Je n'ai pas essayé cette approche par moi-même non plus, mais je pense qu'il pourrait être intéressant d'essayer:
Vous ne savez pas pourquoi personne n'a mentionné la requête DISTINCT.
Voici le moyen de nettoyer les lignes en double:
CREATE OR REPLACE TABLE project.dataset.table
AS
SELECT DISTINCT * FROM project.dataset.table