2016-09-27 4 views
1

У меня есть следующий тип набора данных:SQL/Vertica - группировка многофакторный комбинаций

user_id country1 city1  country2 city2 
1   usa  new york france paris 
2   usa  dallas  japan  tokyo 
3   india  mumbai  italy  rome 
4   france paris  usa  new york 
5   brazil sao paulo russia moscow 

Я хочу, чтобы сгруппировать комбинации country1, city1, country2 и city2 где порядок (что-то country1 или country2) не имеет значения. Как правило, я хотел бы попробовать:

SELECT country1 
     , city1 
     , country2 
     , city2 
     , COUNT(*) 
FROM dataset 
GROUP BY country1 
     , city1 
     , country2 
     , city2 

Однако этот фрагмент кода считает строки с user_id=1 и user_id=4 как два отдельных случаях, когда я хотел бы рассматривать их как равнозначные.

Любой, кто знает, как сотрудничать с этой проблемой?

Заранее благодарен!

ответ

1

Обычно вы применяете этот тип проблем, используя least() и greatest(), но у вас есть два столбца вместо одного. Итак, давайте сделаем это, сравнивая города. Я предполагаю, что city является более уникальным, чем country:

select (case when city1 < city2 then country1 else country2 end) as country1, 
     (case when city1 < city2 then city1 else city2 end) as city1, 
     (case when city1 < city2 then country2 else country1 end) as country2, 
     (case when city1 < city2 then city2 else city1 end) as city2, 
     count(*) 
from dataset 
group by (case when city1 < city2 then country1 else country2 end), 
     (case when city1 < city2 then city1 else city2 end), 
     (case when city1 < city2 then country2 else country1 end), 
     (case when city1 < city2 then city2 else city1 end)