Oracle - уникальные значения из одного столбца, но возвращаются другие столбцы - PullRequest
2 голосов
/ 03 февраля 2011

Я пытаюсь выяснить, как извлекать выбранные значения из столбца таблицы, но также возвращает и другие результаты.Например, скажем, у меня есть следующая таблица

person  ..........
------------------
bob     ..........
mary    ..........
bob     ..........
sue     ..........

То, что я хочу вернуть, это

bob     ..........
mary    ..........
sue     ..........

В этом случае мне все равно, какие значения я фактически получаю обратно для Бобаиз других столбцов, как бы я это сделал?


Продолжите вопрос, что, если мне все равно?Что если бы у меня была эта таблица

person  type    color   ..........
----------------------------------
bob     0       blue    ..........
mary    1       green   ..........
bob     1       red     ..........
sue     0       yellow  ..........

И на этот раз я снова хочу уникальных людей, но я хочу вернуть результаты для Боба, когда его тип равен 0, поэтому для него я бы увидел

bob     0   blue    ..........
mary    1   green   ..........
sue     0   yellow  ..........

Спасибо!

Ответы [ 2 ]

8 голосов
/ 03 февраля 2011

Вы можете использовать аналитические функции , такие как RANK, чтобы описать алгоритм для какой строки вы хотите сохранить, а затем сделать что-то вроде

SELECT *
  FROM (SELECT person,
               type,
               color,
               RANK() OVER( PARTITION BY person
                                ORDER BY type asc ) rnk
          FROM <<person_table>>)
 WHERE rnk = 1

Возвращает «первую» строку для каждого человека, где «первая» определяется строкой с наименьшим значением ТИПА.

Одна вещь, о которой следует помнить, когда вы начинаете смотреть на ранжирование строк, состоит в том, что есть три разные аналитические функции - RANK, DENSE_RANK и ROW_NUMBER - которые в основном выполняют одно и то же, но обрабатывают связи по-разному. RANK - это стандартная функция ранжирования в легкой атлетике - если есть два ряда, которые связывают первое место (то есть два ряда, где PERSON = 'bob' и TYPE = 0), они оба получат ранг 1, в то время как следующий ряд получит ранг 3, поэтому не будет строки «второе место». В той же ситуации DENSE_RANK также присвоил бы двум связанным строкам ранг 1, но присвоил бы следующей строке ранг 2. ROW_NUMBER произвольно присвоил бы одной из связанных строк ранг 1, а другой присвоил бы ранг 2, и присвоить третьей строке ранг 3. Конечно, вы можете разорвать связи, добавив дополнительные столбцы в предложение ORDER BY.

1 голос
/ 04 февраля 2011

Альтернативный синтаксис с использованием общего SQL для баз данных, которые не имеют RANK

SELECT
       person,
       type,
       color

FROM 

   <<person_table>> p 
   inner join 
  (SELECT person, 
         min(type) type              
    FROM <<person_table>>
    GROUP BY 
         person) minType
    on p.Person = minType.Person
       and p.type = minType.type
...