在Vertica中查找集合的交集

时间:2017-07-07 00:32:32

标签: sql database vertica

我正在尝试解决如何在Vertica中找到一对集合的交集(以及更好的方法)。

我有2套第一套更大并存储在单列表中:

San Francisco
New York
Chicago
London
Rome

第二组作为分隔字符串存储在Varchar字段中,并且可以包括不在第1组中的项目,每个集合是每行一个字符串条目

San Francisco,Chicago,Tampa
Tampa,New Orleans,Miami

我需要做的是有效地选择第一组中第二组的成员然后得到两组的交集进行进一步处理,所以对于第二组我需要它返回: / p>

{San Francisco,Chicago}
{}

所以我需要能够遍历包含set 2s的表并获取该信息,然后为包含它的行的每个交集实例执行其他操作。

建议,拜托!

2 个答案:

答案 0 :(得分:1)

我可以生成包含您要查找的内容的表格输出。正如您所期望的那样,以JSON格式导出,在我看来,是前端的工作,而不是数据库。

话虽如此,请看这里:

-- input 1: one city per column
WITH city(city) AS (
          SELECT 'San Francisco'
UNION ALL SELECT 'New York'
UNION ALL SELECT 'Chicago'
UNION ALL SELECT 'London'
UNION ALL SELECT 'Rome'
)
,
-- input 2: many cities per column
cities(cities) AS (
          SELECT 'San Francisco,Chicago,Tampa'
UNION ALL SELECT 'Tampa,New Orleans,Miami'
)
,
-- end of input. Start "real" WITH clause here.
i(i) AS ( -- index for SPLIT_PART()
          SELECT  1 
UNION ALL SELECT  2 
UNION ALL SELECT  3 
UNION ALL SELECT  4 
UNION ALL SELECT  5 
UNION ALL SELECT  6 
UNION ALL SELECT  7 
UNION ALL SELECT  8 
UNION ALL SELECT  9 
UNION ALL SELECT 10
)
,
-- verticalise all those side-by-side cities, using SPLIT_PART() 
-- and the index table above
pivot_cities AS (
  SELECT DISTINCT
    SPLIT_PART(cities,',',i) AS city
  FROM cities CROSS JOIN i
)
-- INNER JOIN input 1 with the distinct verticalised cities of input 2
SELECT
  city.city
FROM city
JOIN pivot_cities USING(city)
;

-- result:
city
-------------
Chicago
San Francisco

答案 1 :(得分:1)

以下是一种不需要使用UNION ALL进行手动转轴以及列表中假定数量的最大项目的方法。在此示例中,表t_city是列中包含单个条目的表,t_cities是列中包含多个条目的表:

WITH cte_cities AS (
    SELECT id, v_txtindex.StringTokenizerDelim(cities, ',') OVER (PARTITION BY id)
      FROM t_cities
)
    SELECT cte_cities.id AS cities_id,
           cte_cities.words AS city 
      FROM cte_cities
INNER JOIN t_city ON t_city.city = cte_cities.words
  GROUP BY cte_cities.id,
           cte_cities.words
  ORDER BY cte_cities.id

这将返回带有id的行,这将允许您在应用程序的前端聚合它们。如果您需要将它们重新组合回逗号分隔列表,那么您需要安装Vertica Strings Extension Package并使用函数group_concat,它可以为您提供所需的结果。