postgresql Postgres SQL与SQL Server等效,用于所有列的非重复值

xdnvmnnf  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(1)|浏览(148)

Postgres SQL:

select distinct on(email_addr) * 
from table1 
order by email_addr, created_date desc;

结果-70个不同值;所有行数据。
SQL Server等效项:

select distinct(email_addr), id, first_name, last_name, created_date 
from table1 
order by email_addr, created_date desc;

结果-160个值;重复的值。
我需要得到正确的SQL查询的帮助。

nzk0hqpo

nzk0hqpo1#

DISTINCT ON是一个在其他数据库中找不到的自定义PostgreSQL特性。
一种更标准的方法是使用ROW_NUMBER() OVER(PARTITION BY Email_Addr ORDER BY Created_Date) as RN,只保留RN=1的行。您必须使用CTE,因为OVER不能在WHERE子句中使用。

;WITH nondups AS (
    SELECT *,
        ROW_NUMBER() OVER(PARTITION BY Email_Addr ORDER BY Created_Date DESC) as RN
    From Table1
    WHERE .....
)
SELECT * 
from nondups
where RN=1

这应该在支持CTE和ROW_NUMBER()的所有数据库上运行。这包括MySQL 8和更高版本。
但是性能可能会受到影响,因为需要对原始结果集的所有行计算ROW_NUMBER。这个查询在PostgreSQL中可能也很慢,因为在选择第一个结果之前,需要收集、分区和排序结果。

相关问题