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

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

Скажем, у меня есть таблица адресов клиентов:

CName           |   AddressLine
-------------------------------
John Smith      | 123 Nowheresville
Jane Doe        | 456 Evergreen Terrace
John Smith      | 999 Somewhereelse
Joe Bloggs      | 1 Second Ave

В таблице один клиент, такой как Джон Смит, может иметь несколько адресов. Мне нужен запрос select для этой таблицы, чтобы вернуть только первую строку, найденную там, где есть дубликаты в "CName". Для этой таблицы он должен возвращать все строки, кроме третьего (или 1-го - любой из этих двух адресов в порядке, но только один может быть возвращен). Есть ли ключевое слово, которое я могу добавить к запросу SELECT для фильтрации, основываясь на том, что сервер уже видел значение столбца раньше?

4b9b3361

Ответ 1

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

SELECT
    CName, MIN(AddressLine)
FROM
    MyTable
GROUP BY
    CName

Если вы хотите, чтобы первый соответствовал, скажем, "вставленному" столбцу, тогда это другой запрос

SELECT
    M.CName, M.AddressLine,
FROM
    (
    SELECT
        CName, MIN(Inserted) AS First
    FROM
        MyTable
    GROUP BY
        CName
    ) foo
    JOIN
    MyTable M ON foo.CName = M.CName AND foo.First = M.Inserted

Ответ 2

В SQL 2k5 + вы можете сделать что-то вроде:

;with cte as (
  select CName, AddressLine,
  rank() over (partition by CName order by AddressLine) as [r]
  from MyTable
)
select CName, AddressLine
from cte
where [r] = 1

Ответ 3

Вы можете использовать row_number(), чтобы получить номер строки строки. Он использует команду over - предложение partition by указывает, когда перезапустить нумерацию, а order by выбирает, что нужно для заказа номера строки. Даже если вы добавили order by в конец вашего запроса, он сохранил бы порядок в команде over при нумерации.

select *
from mytable
where row_number() over(partition by Name order by AddressLine) = 1