2016-04-17 34 views
10

> 1M veri satırı ve 20'den fazla sütun içeren bir tablom var.Bir BigQuery tablosundan yinelenen satırları sil

Masamın içinde (tabloX) Belirli bir sütunda (troubleColumn) yinelenen kayıtları (~ 80k) belirledim.

Mümkünse, orijinal tablo adını saklamak ve yinelenen kayıtları sorunlu sütümümden kaldırmak istiyorum, aksi takdirde aynı şemaya sahip ancak yinelenenler olmadan yeni bir tablo (tableXfinal) oluşturabilirim.

SQL veya başka bir programlama dilinde yetkin değilim, bu yüzden lütfen cehaletimi bağışlayın.

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); 
+0

: sürüm (yerine yeni birinin herhangi bir satır alır)! – TheGoat

cevap

15

Sen tablo yeniden yazar bir sorgu çalıştırarak kopyaları kaldırabilirsiniz (eğer hedef olarak aynı tabloyu kullanabilirsiniz ya da yeni bir tablo oluşturmak senin ne istediğini sahip olduğunu doğrulamak ve daha sonra kopyalayabilirsiniz eski masa üzerinde).

çalışması gerektiğini bir sorgu

buradadır:

SELECT * 
FROM (
    SELECT 
     *, 
     ROW_NUMBER() 
      OVER (PARTITION BY Fixed_Accident_Index) 
      row_number 
    FROM Accidents.CleanedFilledCombined 
) 
WHERE row_number = 1 
+0

Çok teşekkürler Ürdün. – TheGoat

+1

#standardSQL –

+0

ile daha ölçeklenebilir bir alternatif için cevabımı aşağıya bakın API ile bunu yapmanın bir yolu var mı? –

1

şema herhangi bir kayıt yoksa - vs. aynı tablo veya yenisiyle,

üzerinde yazı olan yeterince çalışacak Jordan'ın cevap variation altında
SELECT <list of original fields> 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Fixed_Accident_Index) AS pos, 
    FROM Accidents.CleanedFilledCombined 
) 
WHERE pos = 1 

Daha genel bir durumda - kayıtlar/ağ alanları ile karmaşık bir şemada, vb. - yukarıdaki yaklaşım bir zorluk olabilir.

Her satır için ilgili Fixed_Accident_Index değerine ayarlanmış rows[].insertId ile Tabledata: insertAll API'yi kullanmayı denemeyi öneririm. Bu durumda, yinelenen satırlar BigQuery

tarafından ortadan kaldırılacaktır Elbette, bu bazı istemci tarafı kodlamasını içerecektir - bu nedenle bu soruyla alakalı olmayabilir. Kendim biri tarafından bu yaklaşımı denedik ama denemek için ilginç olabilir hissediyorum sığınak: o)

+0

Teşekkürler Mikhail, pastırmalarımı birkaç kez kurtardınız! – TheGoat

+0

Yuvalanmış/yinelenen alanlarınız varsa, büyük sonuçlara izin vermek ve düzleştirmeyi engellemek için sorgu seçeneğini ayarladığınız sürece, bahsettiğim sorgu çalışmalıdır. –

+0

Orijinal alanları listelemek yerine, Standart SQL kullanıyorsanız aşağıdakileri kullanabilirsiniz: SELECT * hariç (pos) FROM (...) WHERE pos = 1; – killachaos

4

Ürdün'ün cevap alternatifi - bu bir iyi scale çok fazla tekrarlardan zaman:

#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 
) 

Veya daha kısa sadece BigQuery tabloları ben yani benim tablosunun bir kopyasını yapmak gerekir sanırım sadece bu ekler olduğunu okudum

SELECT k.* 
FROM (
    SELECT ARRAY_AGG(x LIMIT 1)[OFFSET(0)] k 
    FROM `fh-bigquery.reddit_comments.2017_01` x 
    GROUP BY id 
) 
+0

Merhaba Felipe, Çok güzel! Bu konuda bir merak konusu olmaksızın, kaynak tablodaki 'DELETE' DML 'i kullanan bir standartSQL sorgusu (sadece) nasıl oluşturursunuz ya da kopyaları silmek için yeniden yazabilirsiniz? –

İlgili konular