1. ホーム
  2. sql

[解決済み] 1列のみのDISTINCT

2022-04-20 21:33:55

質問

例えば、次のようなクエリーがあるとします。

SELECT ID, Email, ProductName, ProductModel FROM Products

重複したEメールを返さないようにするには、どのように修正すればよいですか?

言い換えると、複数の行に同じメールが含まれている場合、そのうちの1行(できれば最後の1行)だけを結果に含めたいのです。他の列の重複は許可されるべきです。

のような節があります。 DISTINCTGROUP 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

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