2017-02-14 6 views
1

Как я могу построить запрос с такими записями, что 2 столбца уникальны? Это моя попытка код:Выберите 2 уникальных столбца в запросе

Select x.a, y.b 
from table1 x, table2 y 
where x.id = y.id; 

1 - a 
2 - b 
3 - a 
4 - b 
5 - c 
1 - c 
6 - a 
2 - a 
should return this: 
1 - a 
2 - b 
5 - c 

Но есть потери данных, это нормально, я только хочу, как уникальные столбцы. Я попытался использовать группу по, но это не дает уникальности обоих. Чтобы более подробно описать намерение: таблица1 над классификацией магазинов, а таблица2 хранит значения. Одна классификация может иметь несколько значений, а одно значение может принадлежать любому числу классификаций. Теперь я хочу выбрать все (или некоторые) классификации из таблицы1 и соответствующие каждому выбрать одно значение, условие состоит в том, что значения не должны повторяться, если они выбраны с любой другой классификацией. Здесь в моем примере 1,2,3..6 являются классификациями, а a, b, c - значениями. Теперь я хочу выбрать классификации и соответствующие значения, я выбрал классификацию 1,2,5 и соответствующие значения a, b, c, потому что всякая другая классификация сделает повторение значения (скажем, 3 сделает значение повторением, поскольку оно уже выбрано с классификацией 1).

+0

Что вы выбираете 1-a более 2-a, 3-a и 6-a? –

+0

Чтобы сделать другие значения уникальными, вы просто упустили значения из первого столбца. Итак, если мы свободны отклонять любые значения, будет ли ваш пустой результат? Он не будет содержать дубликатов. Если это вас не устраивает: по какому правилу вы разрешаете или запрещаете удалять значения из результатов? –

+0

Thorsten, если 1 - a выбрано, то 2 - a не может быть выбрано как 'a' будет повторением. Я добавил описание. – uniquephase

ответ

1

Если Ваши данные указаны, как вы писали выше, значит, они уже уникальны.

1 - a 
2 - b 
3 - a 
4 - b 
5 - c 
1 - c 
6 - a 
2 - a 

[1, а], [3, а], [6, а], [2, а] все отдельные уникальные значения.

Вы можете использовать агрегатную функцию, например min или max, на числовой части, если вы хотите совместить данные. Ваш желаемый результат не является минимальным или максимальным, поэтому не совсем уверен, чего вы пытаетесь достичь.

+0

Jonofan, данные уникальны в совокупности. Но я хочу доработать его таким образом, чтобы столбец 1 был уникальным, а также столбцом 2. Это единственная причина, по которой мне требуется помощь из stackoverflow. Во-вторых, данные, хранящиеся в этом столбце, являются необработанными, не могут принимать максимальные/минимальные значения. – uniquephase

+0

@uniquephase, что имеет больше смысла с вашим обновленным описанием. Я могу приблизиться к вашему желаемому результату, используя CTE с запросом ROW_NUMBER, но я вытаскиваю 1 - где вы хотите 5 - a. Запрос от пользователя1327961 имеет ту же проблему. Я думаю, что вы, возможно, сможете что-то сделать с рекурсивным CTE, но не можете его обнять. – jonofan

+0

Я думаю, что случайно, что @uniquephase, упомянутая «5 - c», должна быть возвращена, так как в описании было упомянуто, что произвольное значение было указано ... Я добавил в своем предложении пункт в своем ответе, который вернется обратно », 5 - c ", но это за счет изменения других выходных значений, поскольку _order по описанию пункта desc_, который я включил, не будет сортировать по классификации desc – user1327961

1

Похоже, что требуется двухуровневая группа?

select  count(*), x.a, y.b 
from  table1 x 
inner join table2 y on x.id = y.id 
group by x.a, y.b; 
+0

Я пробовал это. Он возвращается как 1 - a, 2 - b, 5 - c, 3 - a, 4 - b, 2 - a, 1 - c, 6 - a – uniquephase

+1

Вы уверены, что попытались группировать оба уровня, как показано в примере кода ? Двухуровневая группа будет давать уникальный набор для обоих, что вы хотите на основе описания. Или, вы говорите, что хотите, чтобы колонка a была уникальной полностью, а столбец b уникален? – user1327961

+0

Я хочу, чтобы колонка была уникальной полностью, а столбец b уникален полностью. – uniquephase

3

ОП ищет уникальные значения (таблица2) с произвольной классификацией (таблица1). Таким образом, метод, который можно использовать, - это перечислить все пары классификации и значения в каждой группе значений из таблицы2, а затем выбрать только первое значение из каждой группы.

WITH 
    enumerated_data AS 
    (
     SELECT 
      ROW_NUMBER() OVER (PARTITION BY y.b ORDER BY x.a DESC) rn 
      , x.a 
      , y.b 
     FROM  table1 x 
     INNER JOIN table2 y ON x.id = y.id 
    ) 
SELECT a, b 
FROM enumerated_data 
WHERE rn = 1 
+0

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

+0

добавлено объяснение, пожалуйста, дайте мне знать, если я должен уточнить больше! – user1327961

+0

Разве это не просто 'select max (a), b из ... group by b' написано сложнее? –

 Смежные вопросы

  • Нет связанных вопросов^_^