Oracle 11g SQL для получения уникальных значений в одном столбце многостолбцового запроса - PullRequest
20 голосов
/ 11 июня 2009

С учетом таблицы A людей, их родного языка и других столбцов C3 .. C10, представленных ...

Таблица A

PERSON   LANGUAGE   ...
bob      english
john     english
vlad     russian
olga     russian
jose     spanish

Как создать запрос, который выбирает все столбцы одной строки для каждого отдельного языка?

Желаемый результат

PERSON   LANGUAGE   ...
bob      english
vlad     russian
jose     spanish

Мне не важно, какая строка каждого отдельного языка дает результат. В приведенном выше результате я выбрал самый низкий номер строки для каждого языка.

Ответы [ 6 ]

38 голосов
/ 12 июня 2009

Эрик Петроэле почти имеет право:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

Примечание: используя ROWID (уникальный идентификатор строки), а не ROWNUM (который дает номер строки в наборе результатов)

10 голосов
/ 17 июня 2009

Это будет более эффективно, плюс вы можете контролировать порядок, который он использует для выбора значения:

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language
               ORDER BY person)
      ,language
FROM   tableA;

Если вам действительно все равно, какой человек выбран для каждого языка, вы можете опустить предложение ORDER BY:

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language)
      ,language
FROM   tableA;
7 голосов
/ 11 июня 2009

Мой Oracle немного заржавел, но я думаю, что это сработает:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
2 голосов
/ 11 июня 2009

Я бы использовал функцию RANK () в подвыборке, а затем просто потянул бы строку, где rank = 1.

select person, language
from
( 
    select person, language, rank() over(order by language) as rank
    from table A
    group by person, language
)
where rank = 1
0 голосов
/ 16 июля 2011
select person, language     
from table A     
group by person, language  

вернет уникальные строки

0 голосов
/ 12 июня 2009

Ради эффективности вы хотите, чтобы данные попали только один раз, как это делает Харпер. Однако вы не хотите использовать rank (), потому что это даст вам связи, и в дальнейшем вы захотите группировать по языку, а не по языку. Оттуда вы хотите добавить предложение order by, чтобы различать строки, но вы не хотите на самом деле сортировать данные. Чтобы добиться этого, я бы использовал "порядок по нулю", например,

count (*) over (сгруппировать по языку в порядке нуля)

...