SQL - 基于 2 个值删除重复项

时间:2021-01-14 08:54:50

标签: sql google-bigquery

我有 2 个具有相同表结构的 Postgresql 数据库。出于报告目的,我将这些表的数据推送到单个 Google BigQuery 表中。

在报表上,我有一个名为 databaseID 的列,它指示源数据库是什么。

databaseID - 1(1st postgres table)
databaseID - 2 (2nd postgres table)

现在每次我都将增量数据附加到报表中。所以它有两个数据源的重复项。

报告表中的示例数据:

id  name    DatabaseID  updated_date
1   aaa         1        2020-12-01
2   ccc         1        2020-12-01
1   vvv         1        2021-01-05
1   qqq         2        2020-12-01
2   www         2        2020-12-01
2   aaa         2        2021-01-05
3   xxx         2        2020-12-01

我必须为这两个数据库 ID 删除重复数据。我不确定这个的 SQL 逻辑。

预期输出 - 重复数据删除后:

id  name    DatabaseID  updated_date
2   ccc         1        2020-12-01
1   vvv         1        2021-01-05
1   qqq         2        2020-12-01
2   aaa         2        2021-01-05
3   xxx         2        2020-12-01

3 个答案:

答案 0 :(得分:0)

你能不能试试这样的:

WITH CTE(ID,NAME,DATABASEID,UPDATED_DATE) AS
 (
    SELECT 1,'AAA',1,'2020-12-01'
       UNION ALL
    SELECT 2,'CCC',1,'2020-12-01'
       UNION ALL
    SELECT 1,'VVV',1,'2021-01-05'
       UNION ALL
   SELECT 1,'QQQ',2,'2020-12-01'
       UNION ALL
   SELECT 2,'WWW',2,'2020-12-01'
      UNION ALL
   SELECT 2,'AAA',2,'2021-01-05'
      UNION ALL
   SELECT 3,'XXX',2,'2020-12-01'
)
 SELECT X.ID,X.NAME,X.DATABASEID,X.UPDATED_DATE FROM 
 (
    SELECT C.ID,C.NAME,C.DATABASEID,C.UPDATED_DATE,
        ROW_NUMBER()OVER(PARTITION BY C.ID,C.DATABASEID ORDER BY C.UPDATED_DATE DESC)XCOL
    FROM CTE AS C 
 )X WHERE X.XCOL=1; 

答案 1 :(得分:0)

考虑以下选项

#standardSQL
select as value array_agg(t order by updated_date desc limit 1)[offset(0)]
from `project.dataset.table` t
group by id, DatabaseID  

对于您问题中的示例数据 - 以上返回

enter image description here

答案 2 :(得分:-1)

在 BigQuery 中,一种简单的方法是使用聚合:

select array_agg(r order by updated_date desc limit 1)[ordinal(1)].*
from reporting r
group by id;