2016-04-18 2 views
1

Моя таблица выглядит следующим образом:SQL- Jaccard сходство

author | group 

daniel | group1,group2,group3,group4,group5,group8,group10 
adam | group2,group5,group11,group12 
harry | group1,group10,group15,group13,group15,group18 
... 
... 

Я хочу, чтобы мой выход выглядеть следующим образом:

author1 | author2 | intersection | union 

daniel | adam | 2 | 9 
daniel | harry| 2 | 11 
adam | harry| 0 | 10 

СПАСИБО

+0

Вы должны хранить списки групп в виде строк. Это будет очень сложно. Вы должны использовать надлежащую таблицу соединений. –

ответ

1

Попробуйте ниже (для BigQuery)

SELECT 
    a.author AS author1, 
    b.author AS author2, 
    SUM(a.item=b.item) AS intersection, 
    EXACT_COUNT_DISTINCT(a.item) + EXACT_COUNT_DISTINCT(b.item) - intersection AS [union] 
FROM FLATTEN((
    SELECT author, SPLIT([group]) AS item FROM YourTable 
), item) AS a 
CROSS JOIN FLATTEN((
    SELECT author, SPLIT([group]) AS item FROM YourTable 
), item) AS b 
WHERE a.author < b.author 
GROUP BY 1,2 

решения Добавленного BigQuery Стандартного SQL

WITH YourTable AS (
    SELECT 'daniel' AS author, 'group1,group2,group3,group4,group5,group8,group10' AS grp UNION ALL 
    SELECT 'adam' AS author, 'group2,group5,group11,group12' AS grp UNION ALL 
    SELECT 'harry' AS author, 'group1,group10,group13,group15,group18' AS grp 
), 
tempTable AS (
    SELECT author, SPLIT(grp) AS grp 
    FROM YourTable 
) 
SELECT 
    a.author AS author1, 
    b.author AS author2, 
    (SELECT COUNT(1) FROM a.grp) AS count1, 
    (SELECT COUNT(1) FROM b.grp) AS count2, 
    (SELECT COUNT(1) FROM UNNEST(a.grp) AS agrp JOIN UNNEST(b.grp) AS bgrp ON agrp = bgrp) AS intersection_count, 
    (SELECT COUNT(1) FROM (SELECT * FROM UNNEST(a.grp) UNION DISTINCT SELECT * FROM UNNEST(b.grp))) AS union_count 
FROM tempTable a 
JOIN tempTable b 
ON a.author < b.author 

Что мне нравится это:

  • намного проще/дружественного код
  • нет CROSS присоединитесь и дополнительной GROUP BY необходимой

When/If try - Обязательно снимите галочку Use Legacy SQL checkbox под Опции просмотра

+0

Большое спасибо – AspiringSoftwareDeveloper

Смежные вопросы