2017-07-07 103 views
0

我想弄清楚如何在Vertica中找到一對交集(以及更好的方法)。在Vertica中查找交集

我有2套所述第一組是在單個列表較大並存儲:

San Francisco 
New York 
Chicago 
London 
Rome 

第二組被存儲爲一個VARCHAR字段分隔字符串,並且可以包括在組1中的各項目不一套是每行一個字符串項

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

我需要什麼,能夠做的就是有效地選擇在第一組,第二組的成員,然後讓兩組進行進一步的處理交集所以對於第二組我需要它返回:

{San Francisco,Chicago} 
{} 

所以我需要能夠去通過表包含一組2S和獲取信息,然後做其他事情與包含它的行路口的每個實例。

建議,請!

回答

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

優秀的解決方案!作爲另一種選擇,您可能需要考慮「從城市中選擇城市,regexp_instr(城市,城市)> 0;(不需要」i(i)「)的城市。 – mauro

+0

我期望從一個表中獲取信息並將其聚合到另一個表中,並且有業務要求儘可能將其保留在Vertica內。感謝您的建議!我會試一試,並在我能使它工作時接受答案! –

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,該函數應該會爲您提供所需的結果。