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
Мне не важно, какая строка каждого отдельного языка делает результат. В приведенном выше результате я выбрал самый низкий номер строки каждого языка.
Ответы
Ответ 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
будет возвращать уникальные строки