簡體   English   中英

DISTINCT 只有一列

[英]DISTINCT for only one column

假設我有以下查詢。

SELECT ID, Email, ProductName, ProductModel FROM Products

如何修改它以使其不返回重復的電子郵件?

換句話說,當多行包含相同的電子郵件時,我希望結果只包含其中一行(最好是最后一行)。 應允許在其他列中重復。

DISTINCTGROUP BY這樣的GROUP BY似乎適用於整行。 所以我不確定如何處理這個問題。

如果您使用的是 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

編輯:使用 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

這假設 SQL Server 2005+ 並且您對“last”的定義是給定電子郵件的最大 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

你可以通過像這樣使用GROUP BY這個問題:

SELECT ID, Email, ProductName, ProductModel
FROM Products
GROUP BY Email

當您使用DISTINCT ,請將其視為不同的行,而不是列。 它將僅返回列不完全相同的行。

SELECT DISTINCT ID, Email, ProductName, ProductModel
FROM Products

----------------------
1 | something@something.com | ProductName1 | ProductModel1
2 | something@something.com | ProductName1 | ProductModel1

查詢將返回兩行,因為ID列不同。 我假設ID列是一個遞增的IDENTITY列,如果你想返回最后一個,那么我推薦這樣的:

SELECT DISTINCT TOP 1 ID, Email, ProductName, ProductModel
FROM Products
ORDER BY ID DESC

TOP 1將僅返回第一條記錄,通過按ID降序對其進行排序,它將首先返回最后一行的結果。 這會給你最后的記錄。

對於 Access,您可以使用我在此處提供的 SQL Select 查詢:

例如你有這個表:

客戶|| 名稱 || 郵件

第888章 T800 阿諾德 || t800.arnold@cyberdyne.com

第123話約翰康納 || s.connor@skynet.com

第125話莎拉·康納 ||s.connor@skynet.com

並且您只需要選擇不同的郵件。 你可以這樣做:

SQL 選擇:

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,該最大 ID 的通訊員名稱,您可以通過這種方式添加任何其他屬性。 然后,最后將不同的列放入過濾器,然后僅將其與最后一個不同的列進行分組。

這將為您帶來對應數據的最大 ID,您可以使用 min 或任何其他函數,並將該函數復制到子查詢中。

此選擇將返回:

客戶|| 名稱 || 郵件

第888章 T800 阿諾德 || t800.arnold@cyberdyne.com

第125話莎拉·康納 ||s.connor@skynet.com

請記住對您選擇的列進行索引,並且不同的列不能包含全部大寫或小寫的數字數據,否則將無法工作。 這也僅適用於一封掛號郵件。 快樂編碼!!!

嘗試這個

;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

DISTINCTGROUP BY處理整行的原因是您的查詢返回整行。

幫助您理解:嘗試手動寫出查詢應返回的內容,您會發現將哪些內容放入非重復列是不明確的。

如果您真的不關心其他列中的內容,請不要返回它們。 為每個電子郵件地址隨機返回一行對我來說似乎有點無用。

嘗試這個:

SELECT ID, Email, ProductName, ProductModel FROM Products WHERE ID IN (SELECT MAX(ID) FROM Products GROUP BY Email)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM