我正在使用BigQuery,其中包含一个非常大的表RewriteEngine On
RewriteRule ^ci/(.*)$ /$1 [L,R=301,QSA]
TIMESTAMP字段:
month
我意外地将数据写入了一个月两次,导入两次,错误地使用追加模式。
鉴于BigQuery不允许我更新或删除数据,那么摆脱重复数据的最佳方式是什么?
我已经开始将除问题月份之外的所有数据复制到临时表:
code STRING
org STRING
month TIMESTAMP
现在,我理想的做法是将SELECT * FROM mytable WHERE month!=TIMESTAMP('2012-01-01')
的数据的一个副本,删除每个重复的行,放入同一个临时表中。这可能在SQL中吗?
如果不是,我想我可以直接将2012-01-01
的数据重新导入临时表,但如果可能,我更愿意避免这种情况。
无论哪种方式,我都会将数据的干净副本复制到临时表中,然后将其重新导入到永久表中。
答案 0 :(得分:1)
这不是经典的重复数据删除问题,而是修复意外数据追加 如果刚刚发生这种情况(几天,最多7天),我建议您尝试Snapshot decorators 它允许您在特定时间引用表格的快照 因此,如果您可以在添加数据之前确定时间 - 这可以提供帮助 您仍然需要从该表中选择数据(使用装饰器)并将其写入新表
答案 1 :(得分:0)
您可以执行以下操作删除重复项:
SELECT
code
, org
, month
FROM mytable
WHERE month=TIMESTAMP('2012-01-01')
GROUP BY 1,2,3
答案 2 :(得分:0)
您可以使用带窗口函数的查询来仅选择一个条目,例如此示例,您可以将结果写入不同的表或同一个表。
select * from (
SELECT
rank() over (partition by user_id order by timestamp desc) as _rank,
*
FROM [user_profile_event]
) where _rank=1
在此示例中,我们通过user_id选择重复项,并使用最新值,这就是我们timestamp desc
的原因。
答案 3 :(得分:0)
我知道这已经有一段时间了,但你有没有考虑过" SELECT DISTINCT"声明? " SELECT DISTINCT"仅返回列的不同(不同)值。 http://www.dofactory.com/sql/select-distinct