2012-06-27 6 views
0

Я пытаюсь построить запрос, который дает мне уникальные записи на основе столбца. Это упрощает выборку данных:SQL-запрос для уникальных записей

version  first   last 
a    joe    smith 
b    jane    smith 
c    biff    mcelroy 
a    thad    dussledorf 

Я хотел бы запрос, чтобы вернуть уникальные записи, основанные на version (так как в этом случае 1 экземпляр а, б и в). Для этих возвращенных строк должны быть представлены все 3 столбца. Таким образом, идеальный результат будет:

version  first   last 
a    joe    smith 
b    jane    smith 
c    biff    mcelroy 
+3

Таблицы кучи не имеют понятия «порядок строк». У вашей таблицы есть временная метка или что-то, что можно использовать для выбора соответствующей версии «a»? –

+0

Можете ли вы показать нам, что вы пробовали до сих пор? – Lex

+1

Это для SQL-Server? Или Postgres? Или доступ? Или Firebird? Или SQLite? Или ...? –

ответ

0

Я не уверен, если это будет иметь какие-либо ошибки/проблемы:

select distinct version, 
(select top 1 [first] from tableName t1 where t1.version = t.version) as [first], 
(select top 1 [last] from tableName t1 where t1.version = t.version) as [last] 
from tableName t 

Вы могли бы иметь какое-то «порядок ххх» в каждом подзапросе.

Я не уверен, что 2 подзапроса всегда будут возвращать ту же самую «верхнюю» запись ...?

Но это не идеально. Вам лучше иметь идентификатор записи или временную метку или что-то работать, тогда вы будете использовать другое решение.

1

Если предположить, что база данных поддерживает оконные функции, лучший способ сделать это:

select t.* 
from (select t.*, row_number() over (partition by version order by version) as seqnum 
     from t 
    ) t 
where seqnum = 1 

Это выбирает произвольный «первый» строку для каждой версии.

0

Если вы не беспокоили о том, какие уникальные версии должны быть возвращены из нескольких из них, вы можете просто использовать группу по:

select version, first_name, last_name from table name group by version; 
0

Ответ на ваш вопрос зависит от базы данных. Если вы используете Oracle (pl/sql), то вы можете использовать функцию Rank over:

SELECT * FROM (версия SELECT, первая, последняя RANK() OVER (PARTITION BY version ORDER BY first) RANK FROM SomeTable) WHERE RANK = 1;

Скопировать и вставить этот запрос может не сработать. Поэтому, пожалуйста, прочитайте http://www.techonthenet.com/oracle/functions/rank.php, чтобы получить представление о том, что нужно сделать.

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