【问题标题】:Sort a text aggregate created with array_agg in postgresql在 postgresql 中对使用 array_agg 创建的文本聚合进行排序
【发布时间】:2018-10-16 05:53:03
【问题描述】:

我在 postgresql 中有一个表。下表“动物”可以解释我的问题:

name
------
tiger
cat
dog

现在我正在使用以下查询:

SELECT
    array_to_string(array_agg("name"), ', ')
FROM
    animals;

结果是:“老虎,猫,狗”。但是我想在将聚合转换为字符串之前对其进行排序。所以这是我希望的结果:

"cat, dog, tiger".

那么如何在 postgresql 8.4 中对字符串数组进行排序,然后再将其转换为字符串。 “name”行上的 ORDER BY 不起作用,内置排序函数只处理整数值。

任何一个好主意,如何在纯 SQL 中解决这个问题?

非常感谢 理查德

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    对于现代 PostgreSQL(自 9.0 版起),您可以使用 ORDER BY clause in an aggregate expression

    SELECT
        array_to_string(array_agg(name ORDER BY name), ', ')
    FROM
        animals;
    

    另外,为了您的特定目的,您可以使用string_agg 来简化您的查询:

    SELECT
        string_agg(name, ', ' ORDER BY name)
    FROM
        animals;
    

    【讨论】:

      【解决方案2】:

      这将在 PostgreSQL 9.0 中可用:

      http://www.postgresql.org/docs/9.0/static/release-9-0.html,第 E.1.3.6.1 节。骨料

      与此同时,您可以做这样的事情来解决问题(尽管很笨拙):

      SELECT array_agg(animal_name)
      FROM (
          SELECT "name" AS animal_name
          FROM animals
          ORDER BY "name"
      ) AS sorted_animals;
      

      【讨论】:

      • 这样就行了!并且很高兴知道它将在 9.0 中实现。
      【解决方案3】:

      虽然 Matthew Wood 的回答更适合您的情况,但这里有一种在 PostgreSQL 8.4 及更高版本中对数组进行排序的方法:

      SELECT array(
          SELECT unnest(array[3,2,1]) AS x ORDER BY x
      );
      

      了解arrayunnest 函数会很方便,因为它还可以让您对数组执行"map" 之类的操作:

      SELECT array(
          SELECT x*x FROM (SELECT unnest(array[1,2,3]) AS x) as subquery
      );
      

      同样,这可以是你的 PostgreSQL 8.4 的价格。

      【讨论】:

        【解决方案4】:

        您是否尝试过在数组上使用generate_series(),然后在将其转换为字符串之前对该结果执行SELECT...ORDER BY(或将其嵌套在SELECT 中)?

        【讨论】:

          【解决方案5】:

          不过,对于 8.4 版,使用 Matthew Wood 建议的解决方案,如果您需要在外部查询中进行分组,则内部查询也应进行排序,以使排序保持一致。

          SELECT family, array_agg(animal_name)
          FROM (
              SELECT family, "name" AS animal_name
              FROM animals
              ORDER BY family, "name"
          ) AS sorted_animals
          group by family;
          

          【讨论】:

            【解决方案6】:

            为了更新这个问题,Snowflake 已经实现了数组排序:

            SELECT
                array_sort(array_agg("name")
            FROM
                animals;
            

            也可以使用array_sort_by对对象进行排序

            【讨论】:

              猜你喜欢
              • 2021-11-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-27
              • 2019-08-31
              • 2020-01-05
              • 2014-12-24
              相关资源
              最近更新 更多