【发布时间】:2020-10-27 11:04:48
【问题描述】:
我正在尝试对以下数组进行排序
'{ job.8.10.2.54, job.8.11*, job.44.89.16.188, job.29292.9, job.8.1, job.8.3, job.8.2}'
作为
'{job.29292.9, job.44.89.16.188, job.8.9.2.54, job.8.11*, job.8.3, job.8.2, job.8.1}'
因此,我们的想法是按它们的body(也就是“直到最后一个点的部分”)对它们进行分组。
然后按last_nb排序,表示最后一个点之后的部分(忽略*)
create or replace function order_array(tasks varchar[])
returns varchar[]
language plpgsql
as $$
declare
new_array varchar[];
task varchar:='';
body varchar='';
last_nb integer;
begin
--store body
task:=tasks[1];
body:= substring(task,'.*(?=\.)\.') ;
last_nb:= substring(task, '([\d]+)\*?$');
raise notice 'body %', body;
raise notice 'last_nb %', last_nb;
new_array:=array_agg(x ORDER BY substring(x, '([\d]+)\*?$')::INTEGER desc) FROM unnest(tasks) x;
return new_array;
end
$$;
select * from order_array('{job.8.10.2.54, job.8.11*, job.44.89.16.188, job.29292.9, job.8.1, job.8.3, job.8.2}');
我来了
{job.44.89.16.188,job.8.10.2.54,job.8.11*,job.29292.9,job.8.3,job.8.2,job.8.1}
排序似乎工作正常,我还找到了一种分组方式
select array(select unnest(tasks) order by 1) as sorted_arr, count(*) from unnest(tasks) group by sorted_arr into new_array;
我怎样才能将这些也合并到一个语句中?
谢谢!
【问题讨论】:
标签: arrays postgresql sorting group-by sql-order-by