【问题标题】:array group by part of string and sort by another in postgresql数组按字符串的一部分分组并在postgresql中按另一个排序
【发布时间】: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


    【解决方案1】:

    最后,解决方案不是分组,而是按body排序,然后按last_nb

    CREATE OR REPLACE FUNCTION sortage(
        tasks VARCHAR[]
    )
    RETURNS VARCHAR[]
        LANGUAGE plpgsql
    AS $$
    DECLARE
        regex_body VARCHAR :='.*(?=\.)\.'; -- takes everything up to the last dot
        regex_last_nb VARCHAR :='([\d]+)\*?$'; -- takes everything after the last dot, excluding the *
    
    BEGIN
    
    return  array(SELECT id FROM unnest( tasks ) as id order BY substring(id,regex_body), substring(id, regex_last_nb)::INTEGER desc );
    
    
    END
    $$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2019-08-30
      • 1970-01-01
      • 2014-06-23
      相关资源
      最近更新 更多