[英]DISTINCT for only one column
假設我有以下查詢。
SELECT ID, Email, ProductName, ProductModel FROM Products
如何修改它以使其不返回重復的電子郵件?
換句話說,當多行包含相同的電子郵件時,我希望結果只包含其中一行(最好是最后一行)。 應允許在其他列中重復。
像DISTINCT
和GROUP 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
DISTINCT
和GROUP 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.