Подтвердить что ты не робот

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

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

Таблица A

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

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

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

PERSON   LANGUAGE   ...
bob      english
vlad     russian
jose     spanish

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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;

Ответ 3

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

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

Ответ 4

Я бы использовал функцию 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

Ответ 5

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

count (*) over (группа по порядку слов по null)

Ответ 6

select person, language     
from table A     
group by person, language  

будет возвращать уникальные строки