如何在 Snowflake 中只保留唯一的行?

How to keep only unique rows in Snowflake?

我目前正在将数据从 API 加载到 Snowflake,但找不到在 table 中仅保留唯一行的好方法。此 API.

没有保证唯一的密钥

我探索过:

  1. 我研究过的一个选项是使用不匹配的子句,但至少在我能找到的情况下,它似乎只有在有键的情况下才适用,而不是针对整行。此方法会使用临时 table 进行比较。

  2. 另一种选择是 select 不同于源 table 到临时 table,然后将其加载回源。我不喜欢这种方法,尽管很简单,因为有时源 table 会没有数据。

  3. 我还尝试了一些测试来制作散列,从而在加载之前创建我自己的行内容的键表示作为附加字段。这可能是效率较低的方法,而且似乎是最不标准的。这是可能的,但作为最后的手段,如果我不能使用现有的基础设施,我希望有一个解决方案。

如果有人对这三个路径中的任何一个有任何可行的解决方案和示例查询,我将不胜感激。

我正在寻找的伪代码

sql = "MERGE INTO INVOICES USING INVOICES_TEMP WHEN NOT MATCHED"
cur.execute(sql)

编辑:这种方式不会导致错误,但我可以一遍又一遍地执行它,它会不断向 TABLE 添加相同的行,并且不会像我想要的那样阻止重复项。所以也许我语法不对,但我对 table/fields 的用法不正确。

MERGE INTO TABLE USING TABLE_TEMP ON TABLE.FIELD1=TABLE_TEMP.FIELD1
 AND TABLE.FIELD2=TABLE_TEMP.FIELD2 AND TABLE.FIELD3=TABLE_TEMP.FIELD3
 WHEN NOT MATCHED THEN INSERT (FIELD1,FIELD2,FIELD3) VALUES
 (TABLE_TEMP.FIELD1,TABLE_TEMP.FIELD2,TABLE_TEMP.FIELD3)

如果我理解你的问题是正确的,我更喜欢你的第一个选项。您可以将 MERGE 语句中的列比较扩展到所有列,这样您就不会仅限于键。

merge into target_table using source_table 
    on target_table.col1 = source_table.col1
    and target_table.col2 = source_table.col2
    and target_table.col3 = source_table.col3
    ...

关于合并的更多信息:https://docs.snowflake.com/en/sql-reference/sql/merge.html