簡體   English   中英

如何使用 Snowflake SQL 在單個列中找到字符串的變化?

[英]How can I find the variation in strings in a single column using Snowflake SQL?

假設我有一張這樣的桌子:

人1 人2
戴夫 弗雷德
戴夫 戴夫
戴夫 麥克風
弗雷德 戴夫
戴夫 麥克風
戴夫 傑夫

在“Person1”列中,顯然 Dave 是最受歡迎的輸入,所以我想生成一個“相似度得分”或“列內變化”得分,以反映 SQL(Snowflake)中的得分。

相反,對於“Person2”列,字符串之間的變化更多,因此相似度得分會更低,或者列內的變化更高。 因此,您最終可能會得到類似分數輸出:'Person1': 0.9, 'Person2': 0.4。

如果這只是逐行的 Levenshtein 距離 (LD),我如何在這些之間推動 EDITDISTANCE 以獲得每列的分數? 目前我只能看到如何在“Person1”和“Person2”之間獲得 LD,而不是在“Person1”和“Person2”之間。

非常感謝

您提出的 0.9 和 0.4 的值似乎是相同的比率,因此可以使用 count 和 ratio_of_report 來計算,如下所示:


with data(person1, person2) as (
    select * from values
        ('Dave','Fred'),
        ('Dave','Dave'),
        ('Dave','Mike'),
        ('Fred','Dave'),
        ('Dave','Mike'),
        ('Dave','Jeff')
), p1 as (
    select 
      person1 
      ,count(*) as c_p1
      ,ratio_to_report(c_p1) over () as q
    from data
    group by 1
    qualify row_number() over(order by c_p1 desc) = 1
), p2 as (
    select 
      person2 
      ,count(*) as c_p2
      ,ratio_to_report(c_p2) over () as q
    from data
    group by 1
    qualify row_number() over(order by c_p2 desc) = 1
)
select 
    p1.q as p1_same,
    p2.q as p2_same
from p1
cross join p2
;

給予:

P1_SAME P2_SAME
0.833333 0.333333

編輯距離:

所以使用全交叉連接,我們可以計算所有值的編輯距離,並找到它與總數的比率:

with data(person1, person2) as (
    select * from values
        ('Dave','Fred'),
        ('Dave','Dave'),
        ('Dave','Mike'),
        ('Fred','Dave'),
        ('Dave','Mike'),
        ('Dave','Jeff')
), combo as (
select 
    editdistance(da.person1, db.person1) as p1_dist    
    ,editdistance(da.person2, db.person2) as p2_dist
from data as da
cross join data as db
)
select count(*) as c
    ,sum(p1_dist) as s_p1_dist
    ,sum(p2_dist) as s_p2_dist
    ,c / s_p1_dist as p1_same
    ,c / s_p2_dist as p2_same 
from combo
 ;

但是考慮到 editdistance 給出相同的結果為零和差異的正值,這些的縮放與期望的結果不一致......

JAROWINKLER_SIMILARITY:

鑒於Jarowinklet 相似度結果已經在 0 到 100 之間縮放,因此能夠對其進行平均更有意義。

select 
     avg(JAROWINKLER_SIMILARITY(da.person1, db.person1)/100) as p1_dist    
    ,avg(JAROWINKLER_SIMILARITY(da.person2, db.person2)/100) as p2_dist
from data as da
cross join data as db;
P1_DIST P2_DIST
0.861111111111 0.527777777778

暫無
暫無

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

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