【问题标题】:Get Distinct Value in a List/Cell in PostgreSQL在 PostgreSQL 的列表/单元格中获取不同的值
【发布时间】:2020-06-03 10:17:43
【问题描述】:

碰巧我有这种类型的数据结构并试图消除 Postgres 中 Type 下的重复值。

初始表

Index   Type
1       A, B
2       A, A
3       B, B

预期表

Index   Type
1       A, B
2       A
3       B

感谢您的帮助!

【问题讨论】:

标签: sql postgresql distinct


【解决方案1】:

您可以使用 CTE 将逗号分隔的值拆分为使用 STRING_TO_ARRAYUNNEST 的行;然后使用 STRING_AGG 将不同的值重新组合在一起:

WITH Types AS (
  SELECT DISTINCT Index, UNNEST(STRING_TO_ARRAY(Type, ', ')) AS Type
  FROM Data
)
SELECT Index, STRING_AGG(Type, ', ') AS Type
FROM Types
GROUP BY Index
ORDER BY Index

输出:

Index   Type
1       A, B
2       A
3       B

Demo on SQLFiddle

【讨论】:

    【解决方案2】:

    这是一种不对整个表使用聚合的替代方法:

    SELECT Index,
           (SELECT STRING_AGG(DISTINCT t, ', ')
            FROM UNNEST(STRING_TO_ARRAY(Type, ', ')) AS t
           ) as types
    FROM Data;
    

    Here 是一个 dbfiddle。

    虽然我希望避免外部聚合会在更大的数据集上提高性能,但似乎并非如此。

    【讨论】:

    • 有趣的是explain analyze 似乎表明 CTE 方法更快,并且添加的数据越多,它变得越快。 dbfiddle.uk/…
    • @尼克。 . .很有意思。谢谢你调查。学习新事物总是很有趣。
    • 是的,我必须说我对结果感到惊讶 - 对于您的方法,查询执行计划要短得多。我猜在规划阶段有很多内部优化正在进行。
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多