【问题标题】:Remove old duplicate rows in BQ based on timestamp根据时间戳删除 BQ 中的旧重复行
【发布时间】:2021-11-15 11:46:01
【问题描述】:

我有一个 BQ 表,其中包含相同 ad_id 的重复(x2 次)行。

我想删除 ts > 120 分钟的旧行,其中存在具有相同 ad_id 的新行(架构包含 timestamp, ad_id, value. But there is not rowId)。

这是我的尝试,有更好的方法吗?

DELETE FROM {table_full_name} o
       WHERE timestamp < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 MINUTE) AND timestamp in ( 
                                            SELECT MIN(timestamp) 
                                            FROM  {table_full_name}  i 
                                            WHERE i.ad_id=o.ad_id 
                                            GROUP  BY ad_id) 

数据示例:

`ad-id` | `ts`             | `value`   |
`1`     | Sep-1-2021 12:01 | `Scanned` |
`2`     | Sep-1-2021 12:02 | `Error`   |
`1`     | Sep-1-2021 12:03 | `Removed` |

我想把它清理成:

`ad-id` | `ts`             | `value`   |
`2`     | Sep-1-2021 12:02 | `Error`   |
`1`     | Sep-1-2021 12:03 | `Removed` |

我看到了这个post,但是 BQ 不支持 row-id 的自动递增。

我看到了这个post。但是如何在没有 ts 间隔的情况下修改它(因为它是未知的)。

【问题讨论】:

  • 请详细说明问题。附上数据样本以在什么条件下删除。
  • 解决了我的问题。
  • 嗨,OP。让我们知道答案是否有帮助。如果它有用,请考虑支持它。如果它回答了你的问题,那么请接受它。这样其他人就知道你得到了(足够的)帮助。

标签: sql google-bigquery timestamp sql-delete bq


【解决方案1】:

你可以试试这个脚本。使用COUNT() with HAVING 使用TIMESTAMP_DIFF 从当前时间拉取时间戳早于120 分钟的重复记录。

DELETE
FROM `table_full_name` 
WHERE ad_id in (SELECT ad_id 
                    FROM `table_full_name`
                    GROUP BY ad_id
                    HAVING COUNT(ad_id) > 1) 
AND TIMESTAMP_DIFF(CURRENT_TIMESTAMP(), timestamp, MINUTE) > 120

之前:

之后:

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多