2013-09-28 6 views
1

Мне нужно найти всю уникальную возможную комбинацию значений в столбце таблицы. Например, для значений столбца 1,2,3,4,5. Я хочу, чтобы результат был [1,2], [1,3], [1,4], [1,5], [2,1], [2,3] и т. д.сочетание уникальных значений столбец в таблице

Поблагодарите указатели для построения запроса, чтобы найти комбинацию значений.

благодаря

ответ

1

cross join может быть полезно.

Смотрите эту демку: http://www.sqlfiddle.com/#!12/59af5/1

Синтаксис ANSI SQL использует CROSS JOIN оператор:

create table val(x int); 
insert into val values(1),(2),(3),(4),(5); 

SELECT a.x a, b.x b 
FROM val a 
CROSS JOIN val b 
WHERE a.x <> b.x 
ORDER BY a,b; 



Другая форма этого запроса без CROSS JOIN должен работать на большинстве систем СУБД, но ANSI форма рекомендуется для наглядность:

SELECT a.x a, b.x b 
FROM val a, val b 
WHERE a.x <> b.x 
ORDER BY a,b; 


Опасайтесь, что перекрестное соединение для больших наборов данных может убить вашу производительность базы данных, для 100 значений оно генерирует 100x100 = 10.000 строк, для 1000 -> 1.000.000 строк.

+0

благодарит за ваш отзыв kordirko. Я ищу способ сделать это в google bigquery. – sunil

2

Вы можете выполнить кросс-соединение в BigQuery с помощью подзапроса, который добавляет значение постоянного ключа, а затем присоединяется к этому постоянному значению.

Например, вот запрос, который будет вычислять перекрестное соединение {1, 2, 3} и {2, 4, 6}:

SELECT t1.num as first, t2.num as second 
FROM (
    SELECT num, 1 as key 
    FROM (
     SELECT 1 as num), (
     SELECT 2 as num), (
     SELECT 3 as num)) as t1 
JOIN (
    SELECT num, 1 as key 
    FROM (
     SELECT 2 as num), (
     SELECT 4 as num), (
     SELECT 6 as num)) as t2 
ON t1.key = t2.key 
WHERE t1.num <> t2.num 

ПримечаниеЭтот использует BigQuery "трюк" в создайте две входные таблицы. Если бы вы просто делали это с существующей таблицей, это выглядело бы так:

SELECT t1.num as first, t2.num as second 
FROM (
    SELECT foo as num, 1 as key 
    FROM [my_dataset.my_table]) as t1 
JOIN (
    SELECT foo as num, 1 as key 
    FROM [my_dataset.my_table]) as t2 
ON t1.key = t2.key 
WHERE t1.num <> t2.num 
Смежные вопросы