Как выбрать только первые строки для каждого уникального значения столбца
Скажем, у меня есть таблица адресов клиентов:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
В таблице один клиент, такой как Джон Смит, может иметь несколько адресов.
Мне нужен запрос select для этой таблицы, чтобы вернуть только первую строку, найденную там, где есть дубликаты в "CName". Для этой таблицы он должен возвращать все строки, кроме третьего (или 1-го - любой из этих двух адресов в порядке, но только один может быть возвращен).
Есть ли ключевое слово, которое я могу добавить к запросу SELECT для фильтрации, основываясь на том, что сервер уже видел значение столбца раньше?
Ответы
Ответ 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