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

DISTINCT только для одной колонки

Скажем, у меня есть следующий запрос.

SELECT ID, Email, ProductName, ProductModel FROM Products

Как я могу изменить его, чтобы он не возвращал дубликаты писем?

Другими словами, когда несколько строк содержат один и тот же адрес электронной почты, я хочу, чтобы результаты включали только одну из этих строк (предпочтительно последнюю). Дубликаты в других столбцах должны быть разрешены.

Классы типа DISTINCT и GROUP BY, похоже, работают со всеми строками. Поэтому я не уверен, как подойти к этому.

4b9b3361

Ответ 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)