Допустим, у меня есть таблица адресов клиентов:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
В таблице один клиент, например Джон Смит, может иметь несколько адресов. Мне нужно, чтобы запрос выбора для этой таблицы возвращал только первую найденную строку, в которой есть дубликаты в CName. Для этой таблицы он должен возвращать все строки, кроме 3-й (или 1-й - любой из этих двух адресов в порядке, но может быть возвращен только один). Есть ли ключевое слово, которое я могу добавить в запрос SELECT для фильтрации на основе того, видел ли сервер значение столбца раньше?
В SQL 2k5 + вы можете сделать что-то вроде:
источник
Вы можете использовать
row_number()
для получения номера строки в строке. Он используетover
команду -partition by
предложение указывает, когда перезапустить нумерацию, иorder by
выбирает, по какому порядку номер строки. Даже если вы добавитеorder by
в конец запроса, он сохранит порядок вover
команде при нумерации.источник
ROW_NUMBER()
не работает и вWhere
статье в ТерадатеВы можете использовать такой
row_numer() over(partition by ...)
синтаксис:При этом создается столбец с именем
row
, который представляет собой счетчик, который увеличивается каждый раз, когда он видит то же самоеCName
, и индексирует эти вхождения поAddressLine
. Путем наложенияwhere row = 1
можно выбрать в алфавитном порядке тот,CName
чье имяAddressLine
идет первым. Еслиorder by
былdesc
, то он выбрал бы ,CName
чьиAddressLine
приходит последний в алфавитном порядке.источник
Это даст вам по одной строке из каждой повторяющейся строки. Он также предоставит вам столбцы битового типа, и он работает, по крайней мере, в MS Sql Server.
Если вместо этого вы хотите найти все дубликаты, просто измените rn = 1 на rn> 1. Надеюсь, это поможет.
источник