DISTINCT только для одной колонки
Скажем, у меня есть следующий запрос.
SELECT ID, Email, ProductName, ProductModel FROM Products
Как я могу изменить его, чтобы он не возвращал дубликаты писем?
Другими словами, когда несколько строк содержат один и тот же адрес электронной почты, я хочу, чтобы результаты включали только одну из этих строк (предпочтительно последнюю). Дубликаты в других столбцах должны быть разрешены.
Классы типа DISTINCT
и GROUP BY
, похоже, работают со всеми строками. Поэтому я не уверен, как подойти к этому.
Ответы
Ответ 1
Если вы используете SQL Server 2005 или выше, используйте это:
SELECT *
FROM (
SELECT ID,
Email,
ProductName,
ProductModel,
ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
FROM Products
) a
WHERE rn = 1
EDIT:
Пример использования предложения where:
SELECT *
FROM (
SELECT ID,
Email,
ProductName,
ProductModel,
ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
FROM Products
WHERE ProductModel = 2
AND ProductName LIKE 'CYBER%'
) a
WHERE rn = 1
Ответ 2
Это предполагает SQL Server 2005+, а ваше определение "последний" - это максимальное количество PK для данного адреса электронной почты.
;WITH CTE AS
(
SELECT ID,
Email,
ProductName,
ProductModel,
ROW_NUMBER() OVER (PARTITION BY Email ORDER BY ID DESC) AS RowNumber
FROM Products
)
SELECT ID,
Email,
ProductName,
ProductModel
FROM CTE
WHERE RowNumber = 1
Ответ 3
Когда вы используете DISTINCT
, подумайте об этом как о отдельной строке, а не о столбце. Он будет возвращать только строки, в которых столбцы не совпадают точно так же.
SELECT DISTINCT ID, Email, ProductName, ProductModel
FROM Products
----------------------
1 | [email protected] | ProductName1 | ProductModel1
2 | [email protected] | ProductName1 | ProductModel1
Запрос будет возвращать обе строки, потому что столбец ID
отличается. Я предполагаю, что столбец ID
является столбцом IDENTITY
, который увеличивается, если вы хотите вернуть последнее, тогда я рекомендую что-то вроде этого:
SELECT DISTINCT TOP 1 ID, Email, ProductName, ProductModel
FROM Products
ORDER BY ID DESC
TOP 1
вернет только первую запись, упорядочив ее по убыванию ID
, она вернет результаты с последней строкой в первую очередь. Это даст вам последнюю запись.
Ответ 4
Это можно использовать с помощью функции GROUP BY
SELECT ID, Email, ProductName, ProductModel FROM Products GROUP BY Email
Ответ 5
Для доступа вы можете использовать запрос SQL Select, представленный здесь:
Например, у вас есть эта таблица:
Cliente || NOMBRES || MAIL
888 || T800 ARNOLD || [email protected]
123 || ДЖОН КОННОР || [email protected]
125 || SARAH CONNOR ||[email protected]
И вам нужно выбрать только отдельные письма.
Вы можете сделать это с помощью этого:
SQL SELECT:
SELECT MAX(p.CLIENTE) AS ID_CLIENTE
, (SELECT TOP 1 x.NOMBRES
FROM Rep_Pre_Ene_MUESTRA AS x
WHERE x.MAIL=p.MAIL
AND x.CLIENTE=(SELECT MAX(l.CLIENTE) FROM Rep_Pre_Ene_MUESTRA AS l WHERE x.MAIL=l.MAIL)) AS NOMBRE,
p.MAIL
FROM Rep_Pre_Ene_MUESTRA AS p
GROUP BY p.MAIL;
Вы можете использовать это, чтобы выбрать максимальный идентификатор, имя корреспондента для этого максимального ID, вы можете добавить любой другой атрибут таким образом. Затем в конце вы помещаете отдельный столбец для фильтрации, и вы группируете его только с этим последним отдельным столбцом.
Это даст вам максимальный идентификатор с соответствующими данными, вы можете использовать min или любые другие функции и реплицировать эту функцию на подзапросы.
Этот выбор вернет:
Cliente || NOMBRES || MAIL
888 || T800 ARNOLD || [email protected]
125 || SARAH CONNOR ||[email protected]
Не забудьте указать выбранные столбцы, а отдельный столбец должен иметь не числовые данные в верхнем регистре или в нижнем регистре, иначе он не будет работать.
Это будет работать только с одним зарегистрированным почтовым отправлением.
Счастливое кодирование!!!
Ответ 6
Попробуйте это
;With Tab AS (SELECT DISTINCT Email FROM Products)
SELECT Email,ROW_NUMBER() OVER(ORDER BY Email ASC) AS Id FROM Tab
ORDER BY Email ASC
Ответ 7
Причины DISTINCT
и GROUP BY
работают над целыми строками, так как ваш запрос возвращает целые строки.
Чтобы помочь вам понять: попробуйте вручную выписать запрос, который будет возвращен, и вы увидите, что неоднозначно, что помещать в не дублированные столбцы.
Если вам буквально все равно, что находится в других столбцах, не возвращайте их. Возвращение случайной строки для каждого адреса электронной почты кажется мне немного бесполезным.
Ответ 8
Попробуйте это:
SELECT ID, Email, ProductName, ProductModel FROM Products WHERE ID IN (SELECT MAX(ID) FROM Products GROUP BY Email)