PostgreSQL:每n行分组值

PostgreSQL: Group value every n rows

我有一个带有日期和预算值的简单 table

budget date
10 2022-05-01
5 2022-05-02
15 2022-05-03
16 2022-05-04
22 2022-05-05
13 2022-05-06
23 2022-05-07
56 2022-05-08

我想用 PostgreSQL 语句将 每 N 行 分组。 我希望看到这样的结果,如果 N = 2(例如,它也可以是 3 或 5,视情况而定)

budget date
15 2022-05-01 - 2022-05-02
31 2022-05-03 - 2022-05-04
35 2022-05-05 - 2022-05-06
79 2022-05-07 - 2022-05-08

如果大于 2,则日期格式应为 start_row_date - end_row_date (2022-05-01 - 2022-05-03对于 N = 3)

我们可以尝试使用 ROW_NUMBER window 函数和一些数学来表示 N 如果你的 "date" 可能是数据类型我们可以尝试使用 TO_CHAR 以获得您期望的格式。

SELECT SUM(budget) budget,
       CONCAT(MIN("date"),'-',MAX("date")) date
FROM (
  SELECT *,ROW_NUMBER() OVER(ORDER BY "date") rn
  FROM T 
) t1
GROUP BY (rn - 1)/2
ORDER BY (rn - 1)/2

sqlfiddle

这是@D-Shih提供的解决方案。他是逻辑的所有者,我将其转换为数据库函数以便于其他查看者访问

Note: T = budget_table , Date = bud_date

CREATE or replace FUNCTION budget_function(num integer)
RETURNS TABLE(budget bigint, dub_date text)
LANGUAGE plpgsql
AS $function$
begin

    return query
        SELECT SUM(t1.budget) budget,
               string_agg(TO_CHAR("bud_date",'YYYY-MM-DD'),'-') date
        FROM (
          SELECT *, ROW_NUMBER() OVER(ORDER BY "bud_date") rn
          FROM budget_table
        ) t1
        GROUP BY (rn - 1)/num
        ORDER BY (rn - 1)/num;
    
end
$function$
;

尝试

select * from budget_function(2);
select * from budget_function(3);