Google bigquery 从两个重复记录中各选择一个记录

Google bigquery 从两个重复记录中各选择一个记录,google-bigquery,Google Bigquery,我有一个消息传递应用程序,它定期在BigQuery中插入重复的消息。表名为'metrics',包含以下字段: 行列是一个bigquery行编号(),它不属于度量表的一部分。除批处理id表2之外的所有其他列都为每个消息id复制行。您可以看到消息\u id重复了两次,并且为每次插入创建了一个不同的批处理\u id 我想要这样的输出,只有3行应该在选择结果中,带有3个不同的消息\u id而不是我在这里得到的6行。最好选择在每个消息id的副本中首先插入的行(因为开始时间和结束时间对于副本是相同的,我不确

我有一个消息传递应用程序,它定期在BigQuery中插入重复的消息。表名为'metrics',包含以下字段:

列是一个bigquery行编号(),它不属于度量表的一部分。除批处理id表2之外的所有其他列都为每个消息id复制行。您可以看到消息\u id重复了两次,并且为每次插入创建了一个不同的批处理\u id

我想要这样的输出,只有3行应该在选择结果中,带有3个不同的消息\u id而不是我在这里得到的6行。最好选择在每个消息id的副本中首先插入的行(因为开始时间结束时间对于副本是相同的,我不确定如何找到)。我是Bigquery新手,在sql中看到了一些示例,但在Bigquery中没有看到,因此非常感谢您的帮助


感谢您的帮助。

此重复数据消除过程已成为您业务逻辑的一部分,因此请选择一种方法并保持一致。我会这样做:

with data as (
  select 
  *,
  row_number() over(partition by message_id order by batch_id asc) as rn
  from `project.dataset.table`
)
select * from data where rn = 1

此查询为每个
消息\u id
选择具有“最小”批处理id的行。您的
batch\u id
看起来是随机的/散列的(不一定是按照特定的顺序),因此这可能会或可能会对您的目的起作用,但每次都应该复制相同的结果(除非出现第三条记录,否则它可能会开始变化)。

谢谢,bashid是python中随机生成的字符串。我有时也会收到3条记录或3条以上的副本。应用程序同时启动的记录也超过2条,如果是这样的话,这会起作用吗?通常是的,如果有1,2,3条记录,则它只会为每个
消息\u id
选择1条记录。如果你不关心它来自哪个批次,那么这是一个合理的解决方案。答案很好,谢谢,如果有3条重复记录,则rn为1,2或3,这1,2或3是否表示插入顺序,因此如果选择rn=1,它将给出第一条插入的记录,或者是否有任何方法获得第一条插入的记录?如果您在代码中看到
rn
,它正在按字母顺序获取第一批批id。你说这是随机的,所以我们不能保证哪一个是“第一”。除非您知道批次id的顺序(如果它们以某种方式有序,或者如果存在相关的批次时间戳),否则您将无法判断。如果它们是重复的,并且您有关于批插入的任何信息,那么我不确定您是否需要关心。