分区时使用 PostgreSQL 大小写

问题描述

我正在尝试使用带有分区的 Case when 创建一个新行并标记它是否重复

我想要的输出如下

enter image description here

我正在使用的查询

在这里找不到错误。之前在 sql Server 中好像可以用

SELECT *,CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY 
            x,y > 1) THEN TRUE ELSE FALSE
    END AS is_duplicated
    FROM users
   

解决方法

正如其他两个答案所指出的,> 不是 partition by 的一部分。

我想首先指出,在不使用 row_number() 的情况下使用 order by 是非常非常不鼓励的。如果没有 order by,每次运行的结果可能不同。

更重要的是,您不想要row_number()。您需要 count() -- 因为您需要在 所有 行中存在重复项的 TRUE

第二个是完全不需要 case 表达式,因为 Postgres 有一个布尔类型。

所以:

SELECT u.*,(COUNT(*) OVER (PARTITION BY x,y) > 1) AS is_duplicated
FROM users u;

Here 是一个 dbfiddle。

,

我猜你把括号放错了。你可以试试CASE WHEN ROW_NUMBER() OVER (PARTITION BY x,y) > 1 THEN TRUE ELSE FALSE END吗?

顺便说一句,在 PostgreSQL 中,我猜你也可以这样写:

SELECT
    *,(ROW_NUMBER() OVER (PARTITION BY x,y) > 1) AS is_duplicated
FROM
    users

请注意,如果您想确保将正确的行标记为重复行,您可能还需要在 ORDER BY 子句中包含一个 OVER

顺便说一下,在 Microsoft SQL Server 中测试此查询时,如果我省略 ORDER BY 子句中的 OVER,我会收到一条错误消息。然而,它在 PostgreSQL 中没有 ORDER BY 的情况下也能正常工作。