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
这是@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);
我有一个带有日期和预算值的简单 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
这是@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);