我正在try 按第一个元素对每行的多维数组进行重新排序.

当前表格:

id foobar
1 {{1.2,0.01}, {5.3, 0.05}, {3.5, 0.6}}

所需表格:

id foobar_reorder
1 {{5.3, 0.05}, {3.5, 0.6}, {1.2,0.01}}

我对SQL还不熟悉,但我想我可以将数组解嵌到一个表中,然后按列排序,然后再转换回一个array.我无法放入实际的表和列来创建输出表,但它适用于下面带有测试数组的代码.

在表中取消嵌套数组:

WITH data AS (
    SELECT t.aij_wij AS arr from public.pipe_aggr t
)
SELECT 
    arr[i][1] AS xi, 
    arr[i][2] AS wi
FROM 
    data, 
    generate_subscripts((SELECT arr FROM data), 1) i 
ERROR:  more than one row returned by a subquery used as an expression

取消数组与测试数组的嵌套:

WITH data AS (
    SELECT ARRAY[[1.2,0.01],[5.3, 0.05], [3.5,0.6]]::float8[] AS arr
)
SELECT 
    arr[i][1] AS xi, 
    arr[i][2] AS wi
FROM 
    data, 
    generate_subscripts((SELECT arr FROM data), 1) i
;

推荐答案

这将按降序对第一维的数组进行排序(同时保留二维数组):

SELECT d.id, a.*
FROM   data d
LEFT   JOIN LATERAL (
   SELECT ARRAY(
      SELECT array_agg(d.foobar[d1][d2]) AS arr1
      FROM   generate_subscripts(d.foobar, 1) d1
           , generate_subscripts(d.foobar, 2) d2
      GROUP  BY d1
      ORDER  BY arr1 DESC
      )
   ) a(foobar_reorder) ON d.foobar IS NOT NULL;

fiddle

LEFT JOIN ... ON d.foobar IS NOT NULL保留nullnull.

请参见:

Sql相关问答推荐

在SQL中向每个子字节组添加字节行

如何从上一个值减go 值

如何通过比较不同表中相同ID S的值来筛选ID为S的列表?

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

Postgres trunc_date删除一个月

SQL Oracle条件分组依据

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

在SQL查询中查找客户端的最短日期比较列和多行

配置单元查询失败:无法识别';附近的输入;LEFT'';(select子句中的';';col'

获取分布在同一行的列中的出现次数

对现有记录进行分组

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

Oracle SQL:通过将日期与另一个表行进行比较来 Select 值

SQL ORACLE - 查找连续天数

如何优化仅返回符合条件的三条记录的查询?

我如何编写一个遍历数组数组并将所有值连接成一个字符串的 postgres 函数

如何仅在满足条件时才按顺序在 SQL 中计数?

在 BigQuery 数据集中查找表大小和占总数据集大小的百分比

Postgres:表的累积视图

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?