PostgreSQL数组 - 删除连续相同的值[重复]

Posted

技术标签:

【中文标题】PostgreSQL数组 - 删除连续相同的值[重复]【英文标题】:PostgreSQL array - Remove consecutive identical values [duplicate] 【发布时间】:2022-01-12 11:15:39 【问题描述】:

PostgreSQL 文本array 中,我想删除连续的相同值。 distinct 是不够的,因为我可以有重复的值但不是连续的,我想保留它们。值的顺序很重要。

例如

SELECT ARRAY['A', 'B', 'C', 'C', 'D', 'A'];

应该返回A,B,C,D,A

-- 编辑

正如@MkSpring Mk 所说,这个post 提出了一个答案。我尝试适应它:

WITH q_array AS (
    SELECT ARRAY['A', 'B', 'C', 'C', 'D', 'A'] AS full_array
    ), q_unnest AS (
        SELECT  
        unnest(full_array) AS unnest_array
        FROM q_array
        ), q_id AS (
            SELECT
            row_number() OVER () AS id,
            unnest_array
            FROM q_unnest
        )
SELECT
array_agg(q_id.unnest_array) AS array_logical
FROM (SELECT q_id.*, lag(q_id.unnest_array) OVER (ORDER BY q_id.id) AS unnest_array_logical FROM q_id) q_id
WHERE unnest_array_logical IS DISTINCT FROM q_id.unnest_array

我觉得这个语法很冗长,可能是我的方法不够高效。

这个语法可以吗?创建函数是最佳实践还是可以直接在查询中编写?

【问题讨论】:

部分是因为在我的配置中我没有本地 ID 列。而且我还问将它写在查询或专用函数中是否是一种好习惯。 【参考方案1】:

为了提高查询性能,我做了这个函数:

CREATE OR REPLACE FUNCTION array_remove_consecutive_duplicates(
    array_vals anyarray)
    RETURNS TABLE(array_logical anyarray) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

AS $BODY$
    BEGIN
      RETURN QUERY 
      WITH q_array AS (
    SELECT array_vals AS full_array
    ), q_unnest AS (
        SELECT  
        unnest(full_array) AS unnest_array
        FROM q_array
        ), q_id AS (
            SELECT
            row_number() OVER () AS id,
            unnest_array
            FROM q_unnest
        )
SELECT
array_agg(q_id.unnest_array) AS array_logical
FROM (SELECT q_id.*, lag(q_id.unnest_array) OVER (ORDER BY q_id.id) AS unnest_array_logical FROM q_id) q_id
WHERE unnest_array_logical IS DISTINCT FROM q_id.unnest_array;
    END;
  
$BODY$;

我的查询现在会这样写:

SELECT array_remove_consecutive_duplicates(ARRAY['A', 'B', 'C', 'C', 'D', 'A']);

在查询中使用它比我的第一种方法更快、更容易。也许这不是好方法,或者我的语法效率不高。如果有人有更好的建议,我会采纳。

【讨论】:

以上是关于PostgreSQL数组 - 删除连续相同的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

请教thinkphp 二维数组值去重怎么去的哦

PostgreSQL 可以索引数组列吗?

Firestore 在更新数组时不存储两个相同的值

php 二维数组过滤相同的值

数据结构与算法--数组

PostgreSQL 9.2 归档恢复后最后重放的 WAL