如何通过接受空值的查询进行PARTITION?

时间:2018-07-11 18:55:44

标签: sql postgresql partition-by

我有一个查询,需要将PARTITION BY与2个字段一起使用。我正在这样做:

SELECT
    ROW_NUMBER()
    OVER (PARTITION BY
            id, country_id
        ORDER BY
            id, country_id) AS row_number
    FROM
        cities
    ...

问题是country_id中使用的第二个聚合字段PARTITION BY可以是NULL,我需要将ROW_NUMBER()进行汇总。

row_number()仅在结果集中存在具有相同idcountry_id的记录时才进行汇总。如果有一条记录具有相同的idcountry_id或相同的idcountry_idNULL,我希望对它进行总结。

有办法吗?

3 个答案:

答案 0 :(得分:2)

您可以如下所示使用合并:

SELECT
    ROW_NUMBER()
    OVER (PARTITION BY
            id, Coalesce(country_id,0)) AS row_number
    FROM
        cities
    ...

答案 1 :(得分:1)

如果值之一为NULL,则没有区别。另一方面,按相同的列进行排序没有用。在Postgres中,order by是可选的,因此您可以执行以下操作:

row_number() over (partition by id, country_id)

答案 2 :(得分:1)

尝试替换为空

SELECT
ROW_NUMBER()
OVER (PARTITION BY
        id, ISNULL(country_id,-1)
    ORDER BY
        id, ISNULL(country_id,-1)) AS row_number
FROM
    cities
...