Как переопределить Distinct - PullRequest
       12

Как переопределить Distinct

1 голос
/ 11 сентября 2009

Мой босс дал мне задание, в котором я не уверен, что это возможно, так как примерно через две недели я не могу найти решение, поэтому я выбрасываю это, чтобы попросить любую помощь от SO группа. Если это сломает ваш мозг, я прошу прощения.

Сначала немного предыстории: мы разрабатываем приложение для запросов к базе данных, которое позволяет пользователям получать все, что они хотят, из базы данных, не зная SQL.

Моя проблема: Мы хотим настроить способ выбора «Отличительный». Вместо того, чтобы ключевое слово применимо к выбранным строкам, мы хотим, чтобы оно применялось только к определенным полям, чтобы использовались первые строки, соответствующие этим полям. Для примера:

Боб Джонс, 122 Мэйн Стрит, Портленд, Орегон
Сью Джонс, 122 Main Street, Портленд, Орегон
Мэри Смит, 458 32-я улица, Портленд, Орегон
Ральф Смит, 458 32-я улица, Портленд, Орегон

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

Боб Джонс, 122 Мэйн Стрит, Портленд, Орегон
Мэри Смит, 458 32-я улица, Портленд, Орегон

При нормальном отличном состоянии будут возвращены все четыре строки, что больше, чем мы хотим. У кого-нибудь есть идеи относительно того, как мы можем это сделать? Спасибо.

Ответы [ 3 ]

5 голосов
/ 12 сентября 2009
WITH NumberedRows AS (
   SELECT FirstName, LastName, Address,
          ROW_NUMBER() OVER (PARTITION BY Address ORDER BY Id) as RowNumber
   FROM Table
) SELECT FirstName, LastName, Address
  FROM NumberedRows
  WHERE RowNumber = 1;

PARTITION BY Address указывает список столбцов, по которому вы хотите сгруппировать, а ORDER BY ID указывает список столбцов, с которым вы определяете «первый» элемент.

(Убедитесь, что предыдущий оператор завершается точкой с запятой.)

3 голосов
/ 12 сентября 2009

ВЫБРАТЬ МИН (a.firstname + a.lastname), адрес от x Группировать по адресу.

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

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

3 голосов
/ 12 сентября 2009

Вы должны выполнить обычный SQL-оператор SELECT DISTINCT, который запрашивает только те поля, которые действительно должны быть различны. Затем, как только вы их вернете, запустите другой запрос, который берет ТОП 1 запись с соответствующими данными, чтобы получить неотличимые поля. В настоящее время я не вижу способа сделать это с помощью одного оператора SQL ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...