簡體   English   中英

查找從雪花表中返回唯一行的所有列

[英]Find all columns that return unique rows from table in snowflake

有什么辦法可以做到這一點?

我正在研究雪花表,其中大多數主鍵未在 ddl 中定義。 而且由於雪花中沒有強制執行主鍵,它有重復的記錄。

有沒有辦法獲取所有獲取唯一記錄的列名。

我的表有 30 多列,要識別返回唯一行的列是一項麻煩的任務,因為我必須通過不同的列名進行檢查,然后匹配表中存在的總行數。

例如。 總行數 (*) = 50

它有 col - 1,2,3,4,5,6,7,8,9

  • col 1 的不同返回 20 行
  • col1, col2 的不同返回 30
  • col1、col2、col7 的不同返回 50 行

我必須手動獲取列名,然后將其與總記錄匹配。

有什么方法可以在不逐一檢查每一列或列組合的情況下獲取列名?

如果有人可以指導我這將是很大的幫助。

我想不出簡單的方法,但你可以開始運行這樣的查詢:

SELECT column1, column2, count(*)
FROM mytable
GROUP BY 1,2
HAVING COUNT(*) > 1

如果返回結果,請添加另一列:

SELECT column1, column2, column3, count(*)
FROM mytable
GROUP BY 1,2,3
HAVING COUNT(*) > 1

重復直到查詢返回零結果,這意味着您現在有了一個唯一的組合。

但是,請注意,這並不能保證組合將隨着時間的推移保持唯一,也不能保證這是數據中列的唯一唯一組合。您需要更深入地了解數據及其來源才能找到真正唯一的鍵,如果一個存在。

我想您的要求是從具有重復行(無主鍵)的源表中獲取唯一行,如果是,您可以使用合並語句。

  1. 可以使用 Merge 語句實現行的唯一性 建議使用 MERGE 根據 DML 類型對每條記錄進行不同的處理https://docs.snowflake.com/en/sql-reference/sql/merge.html#merge

示例:這里我們假設如果您在源表中有任何重復數據,我們將使用帶有臨時表的合並語句,合並將在目標表和源表之間的每一行的 hash 鍵上,如果沒有匹配,那么只有它會將行插入到目標表中。

如果存在則刪除表 tgt_tb;

創建或替換臨時表 tgt_tb (id int, name string);

如果存在 src_tb 則刪除表; 創建臨時表 src_tb (id int, name string);

insert into src_tb select 1,'a' union all select 1,'a' union all select 2,'b' union all select 3,'c';

插入 tgt_tb select 3,'c';

如果存在 src_stg_tb 則刪除表; 創建臨時表 src_stg_tb 作為 select * 從

(select , ROW_NUMBER() OVER(PARTITION BY hash( ) order by hash( )) as rnm, hash( ) as hashkey from src_tb ) A where A.rnm=1;

在不匹配時使用 src_stg_tb SRC on hash(tgt.id, tgt.name) = SRC.hashkey 合並到 tgt_tb TGT 然后插入值 (src.id,src.name)

--從 tgt_tb 中選擇 *; 使用 MERGE,您可以指定“WHEN MATCHED”和“WHEN NOT MATCHED”。 對於僅插入新數據,我們使用帶有“WHEN NOT MATCHED”子句的 MERGE 語句。

問候, 蘇揚

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM