为了查看没有重复记录的记录,我使用这个 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)
仅显示单个表中的重复记录的最佳实践是什么?
以下是 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)
为什么不直接改变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 个相同的元素)。
| 归档时间: |
|
| 查看次数: |
27778 次 |
| 最近记录: |