如何在 Big Query 中仅显示重复记录?

Oks*_* Ok 10 google-bigquery

为了查看没有重复记录的记录,我使用这个 SQL

SELECT * EXCEPT(row_number)
FROM (SELECT*,ROW_NUMBER() OVER (PARTITION BY orderid) row_number
FROM `TABLE`)
WHERE row_number = 1
Run Code Online (Sandbox Code Playgroud)

仅显示单个表中的重复记录的最佳实践是什么?

Mik*_*ant 8

以下是 BigQuery 标准 SQL

就我个人而言,只要有可能,我不喜欢依赖 ROW_NUMBER(),因为数据量很大时,它往往会导致资源超出错误

因此,根据我的经验,我会推荐以下选项:

查看只有一条记录的 orderid 记录:

#standardSQL
SELECT AS VALUE ANY_VALUE(t) 
FROM `project.dataset.table` t
GROUP BY orderid
HAVING COUNT(1) = 1  
Run Code Online (Sandbox Code Playgroud)

查看具有多个条目的 orderid 的记录:

#standardSQL
SELECT * EXCEPT(flag) FROM (
  SELECT *, COUNT(1) OVER(PARTITION BY orderid) > 1 flag
  FROM `project.dataset.table` 
) 
WHERE flag  
Run Code Online (Sandbox Code Playgroud)

注意:在幕后 - COUNT(1) OVER() 可以使用尽可能多的可用工作人员来计算,而 ROW_NUMBER() OVER() 要求将所有相应数据移动到一个工作人员(因此与资源相关的问题)

或者

#standardSQL
SELECT *
FROM `project.dataset.table` 
WHERE orderid IN (
  SELECT orderid FROM `project.dataset.table` 
  GROUP BY orderid HAVING COUNT(1) > 1
  )
Run Code Online (Sandbox Code Playgroud)


Raf*_*aël 5

为什么不直接改变row_number呢?您已按 进行分区order id,创建重复项的分区,对记录进行排名,并仅采用第一个元素来删除重复项。但如果您只获取row_number = 2,您将只拥有来自至少有 2 个元素的分区的元素,即只有重复项。

SELECT * EXCEPT(row_number)
FROM (SELECT*,ROW_NUMBER() OVER (PARTITION BY orderid) row_number
FROM `TABLE`)
WHERE row_number = 2
Run Code Online (Sandbox Code Playgroud)

注意:使用row_number = 2只会给你 1 个重复元素。如果您选择row_number > 1,结果可能会再次包含重复项(例如,如果第一个表中有 3 个相同的元素)。