Сравнение массивов между таблицами

#sql #presto

#sql #presto

Вопрос:

Я запрашиваю некоторые data (SQL, presto) , я изо всех сил пытаюсь объединить 2 таблицы. Мне нужно знать, с какими командами связаны проблемы, на основе тегов команд, указанных в таблице тегов. Каждая проблема может быть связана с многочисленными командами.

Таблица 1 team :

 name  | tags
------ --------------------
team1 | [1234, 2345, 5678]
team2 | [6789, 4321]
team3 | [4530]
team4 | [6532]
team5 | [3452, 34234, 868686]
  

Таблица 2 issues :

 issue_id | tags
--------- --------------------------------------------
   1     | [312312, 45345, 4535,1111,4533,4530, 4321 ]
   2     | [312312, 45345, 6532]
   3     | [6532]
   4     | [312312, 1234, 4321]
   5     | [312312]
  

Мне нужно, чтобы это выглядело как:

 issue_id | team
--------- --------
1        | team3
1        | team2
2        | team4
3        | team4
4        | team1
4        | team2
  

Я бы хотел избежать жесткого кодирования, поскольку список teams и связанные tags с ними могут быть динамическими, но не уверен, как подойти к этой проблеме

Ответ №1:

Приведенный ниже SQL преобразует значения тегов в обеих таблицах для преобразования из массива в отдельные значения, чтобы их можно было объединить в 2 таблицы для групп запросов и отображения и их соответствующих проблем.

   Select T2.issue_id as issue_id,
             T1.name as team
  from
   (SELECT name, tag
    FROM table1
    CROSS JOIN UNNEST(tags) AS t (tag)) T1
   JOIN
  (SELECT issue_id, tag
    FROM table2
    CROSS JOIN UNNEST(tags) AS t (tag)) T2
  ON T1.tag = T2.tag;
  

Ответ №2:

Я последовал вашему примеру в Snowflake, который имеет flatten функцию. Из того, что я вижу в документе presto, это тоже есть. Может быть, это поможет?

В Snowflake мне удалось выполнить ваше требование.

 with ISSUES as(

SELECT 
    T.ISSUE_ID,
    X.VALUE::INTEGER AS TAGS
FROM PUBLIC.ISSUES T, LATERAL FLATTEN(T.TAGS) X),

TEAMS as(
SELECT 
    T.TEAM,
    X.VALUE::INTEGER AS TAGS
FROM PUBLIC.TEAMS T, LATERAL FLATTEN(T.TAGS) X)


SELECT 
   ISSUES.ISSUE_ID, 
   TEAMS.TEAM FROM TEAMS
INNER JOIN ISSUES on TEAMS.TAGS = ISSUES.TAGS
  

Комментарии:

1. Спасибо! У него есть flatten, но LATERAL, похоже, не работает в версии, которую я использую. Ваш метод помог мне разобраться в этом!

2. Приятно слышать. Нет проблем!